Показать сообщение отдельно
Старый 30.01.2015, 16:55   #1  
Akri is offline
Akri
Участник
 
23 / 10 (1) +
Регистрация: 16.08.2011
): Почему используется индекс (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 одинаковая на тесте и на рабочей (ну может быть только совсем немного отличаются данные).