Здравствуйте.
Возникла задача оптимизации запроса из TOP30 по статистике Oracle.
Вот он:
Код:
SELECT /*+ FIRST_ROWS */
a.invoiceid, a.invoicedate, a.linenum, a.inventtransid, a.
itemid, a.externalitemid, a."NAME", a.taxgroup, a.currencycode,
a.priceunit, a.qty, a.del_costvalue, a.salesprice, a.
discpercent, a.discamount, a.lineamount, a.ledgeraccount, a.
dimension, a.dimension2_, a.dimension3_, a.dimension4_, a.
dimension5_, a.qtyphysical, a.partdelivery, a.remain, a.
salesid, a.salesunit, a.salesmarkup, a.transactioncode, a.
del_configid, a.taxautogenerated, a.taxitemgroup, a.taxamount,
a.taxwritecode, a.multilndisc, a.multilnpercent, a.linedisc,
a.linepercent, a.origsalesid, a.lineheader, a.transport, a.
inventdimid, a.numbersequencegroup, a.statprocid, a.dlvdate,
a.lineamounttax, a.port, a.customerlinenum, a.lineamountmst,
a.taxamountmst, a.lineamounttaxmst, a.sumlinedisc, a.
sumlinediscmst, a.intercompanyinventtransid, a.excisevalue_ru,
a.vatvalue_ru, a.exciseamount_ru, a.vatamount_ru, a.
facturedqty_ru, a.facturedfully_ru, a.inventshiftjournalid,
a.returnactionid, a.createdby, a.recid
FROM custinvoicetrans a
WHERE SUBSTR(NLS_LOWER(salesid), 1, 20) = NLS_LOWER(:in1)
AND SUBSTR(NLS_LOWER(invoiceid), 1, 20) = NLS_LOWER(:in2)
AND invoicedate = :in3
AND SUBSTR(NLS_LOWER(numbersequencegroup), 1, 10) =
NLS_LOWER(:in4)
ORDER BY SUBSTR(NLS_LOWER(a.itemid), 1, 25), a.invoicedate
Как видите, выбираются все поля таблицы CustInvoiceTrans с хинтом firstonly (или firstfast). Потратил уже три дня на поиск кода, откуда вызывается этот запрос. Что предпринимал: искал по AOT всевозможные комбинации "select [firstonly] [firstfast] custinvoicetrans", также проверял, не используются ли классы Query/QueryRun/... поиском "addRange(fieldNum(custInvoiceTrans", смотрел Query's, которые располагаются в AOT. Результаты получились следующие - есть запросы почти идентичные этому, но ни один из них не содержат выражения ORDER BY (или не вызывают метод addSortField()). Пробовал смотреть их SQL-код - ORDER BY там не появлялся.
Отчаявшись, сижу и перебираю результаты поиска по всему AOT строки "CustInvoiceTrans". 1702 результата и успехом пока не пахнет.
Может быть, я упустил какую-то возможность или не учел какой-то случай? Буду рад любой помощи.