30.01.2015, 16:55 | #1 |
Участник
|
): Почему используется индекс (Oracle, DAX 2009)
Oracle, DAX 2009
С какого-то момента стала сильно задумываться рабочая аксапта на некоторых запросах – просто зависать минут на 5 – 20. В качестве примера есть такой запрос, который запускается просто из джобика: select firstonly RecId from SalesTable where SalesTable.SalesId != "Заказ1" && SalesTable.CustAccount == "Клиент1" && SalesTable.RegionOrigSalesId == "123" ; План запроса пишет такой: SELECT /*+ INDEX(A I_366CUSTIDX) FIRST_ROWS */A.RECID FROM SALESTABLE A WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,4)=NLS_LOWER(:IN1)) AND (((SUBSTR(NLS_LOWER(SALESID),1,20)<>NLS_LOWER(:IN2)) AND (SUBSTR(NLS_LOWER(CUSTACCOUNT),1,20)=NLS_LOWER(:IN3))) AND (SUBSTR(NLS_LOWER(REGIONORIGSALESID),1,20)=NLS_LOWER(:IN4)))) Причем у нас есть тестовая конфигурация, на которой тот же самый запрос отрабатывает мгновенно (как и работало раньше на рабочей). На тесте план запроса такой: SELECT /*+ FIRST_ROWS */A.RECID FROM SALESTABLE A WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,4)=NLS_LOWER(:IN1)) AND (((SUBSTR(NLS_LOWER(SALESID),1,20)<>NLS_LOWER(:IN2)) AND (SUBSTR(NLS_LOWER(CUSTACCOUNT),1,20)=NLS_LOWER(:IN3))) AND (SUBSTR(NLS_LOWER(REGIONORIGSALESID),1,20)=NLS_LOWER(:IN4)))) Много всего перерыли на эту тему. Сначала просто хочется понять в какую сторону копать – почему на рабочей базе используется индекс CustIdx (в него не входит REGIONORIGSALESID)? Таблица SalesTable одинаковая на тесте и на рабочей (ну может быть только совсем немного отличаются данные). |
|
|
|