Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Как применить расчитанный (улучшеный) с помощью Advisor Central план выполнения запроса к самому запросу? По возможности, не прибегая к кодингу.

Ситуация следующая:
1) Сложный запрос, переданный ораклу из внешней системы не видит индекса и работает:
TABLE ACCESS FULL

К сообщению приложен файл. Размер - 0Kb
14 авг 09, 12:39    [7538687]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
2) ...далее, Oracle в EM кричит, что нашел тяжелый запрос и предлагает его заоптимизировать.
На что я соглашаюсь и получаю новый, продвинутый план выполнения запроса :

К сообщению приложен файл. Размер - 0Kb
14 авг 09, 12:41    [7538712]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Теперь вопрос: как теперь намекнуть Oracle что вот она - панацея, бери и радуйся?

P.S. До этого пытался перестоить статистику с помощью пакета DBMS_STATS по таблице.
Перестраивал, но оптимизатор что-то все равно не подхватывал индекс
14 авг 09, 12:44    [7538733]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
бусь
Member

Откуда: Резиновск
Сообщений: 249
где запрос
14 авг 09, 12:45    [7538742]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
вот что вижу в Oracle:

SELECT SUM(A.AMOUNTCUR),SUBSTR(NLS_LOWER(A.ACCOUNTNUM),1,20),
SUBSTR(NLS_LOWER(A.CURRENCYCODE),1,3),SUBSTR(NLS_LOWER(A.DIMENSION),1,10),
SUBSTR(NLS_LOWER(A.DIMENSION2_),1,10),SUBSTR(NLS_LOWER(A.DIMENSION3_),1,10),
SUBSTR(NLS_LOWER(A.DIMENSION4_),1,10),SUBSTR(NLS_LOWER(A.DIMENSION5_),1,10),
SUBSTR(NLS_LOWER(A.DIMENSION6_),1,10),A.CREDITING FROM LEDGERTRANS A 
WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,4)=NLS_LOWER(:in1)) 
AND ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in2)) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in3))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in4))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in5))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in6))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in7))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in8))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in9))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in10))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in11))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in12))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in13))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in14))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in15))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in16))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in17))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in18))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in19))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in20))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in21))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in22))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in23))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in24))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in25))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in26))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in27))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in28))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in29))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in30))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in31))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in32))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in33))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in34))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in35))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in36))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in37))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in38))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in39))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in40))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in41))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in42))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in43))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in44))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in45))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in46))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in47))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in48))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in49))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in50))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in51))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in52))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in53))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in54))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in55))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in56))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in57))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in58))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in59))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in60))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in61))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in62))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in63))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in64))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in65))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in66))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in67))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in68))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in69))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in70))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in71))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in72))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in73))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in74))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in75))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in76))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in77))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in78))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in79))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in80))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in81))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in82))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in83))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in84))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in85))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in86))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in87))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in88))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in89))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in90))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in91))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in92))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in93))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in94))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in95))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in96))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in97))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in98))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in99))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in100))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in101))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in102))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in103))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in104))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in105))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in106))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in107))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in108))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in109))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in110))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in111))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in112))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in113))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in114))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in115))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in116))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in117))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in118))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in119))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in120))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in121))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in122))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in123))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in124))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in125))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in126))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in127))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in128))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in129))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in130))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in131))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in132))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in133))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in134))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in135))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in136))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in137))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in138))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in139))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in140))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in141))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in142))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in143))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in144))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in145))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in146))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in147))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in148))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in149))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in150))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in151))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in152))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in153))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in154))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in155))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in156))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in157))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in158))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in159))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in160))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in161))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in162))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in163))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in164))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in165))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in166))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in167))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in168))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in169))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in170))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in171))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in172))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in173))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in174))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in175))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in176))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in177))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in178))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in179))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in180))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in181))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in182))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in183))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in184))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in185))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in186))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in187))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in188))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in189))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in190))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in191))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in192))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in193))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in194))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in195))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in196))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in197))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in198))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in199))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in200))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in201))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in202))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in203))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in204))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in205))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in206))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in207))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in208))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in209))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in210))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in211))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in212))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in213))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in214))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in215))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in216))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in217))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in218))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in219))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in220))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in221))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in222))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in223))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in224))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in225))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in226))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in227))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in228))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in229))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in230))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in231))) OR 
(SUBSTR(NLS_LOWER(ACCOUNTNUM),1,20)=NLS_LOWER(:in232))) AND ((TRANSDATE>=:in233) 
AND (TRANSDATE<=:in234)))) GROUP BY 
SUBSTR(NLS_LOWER(A.ACCOUNTNUM),1,20),SUBSTR(NLS_LOWER(A.CURRENCYCODE),1,3),SUBST
R(NLS_LOWER(A.DIMENSION),1,10),SUBSTR(NLS_LOWER(A.DIMENSION2_),1,10),SUBSTR(NLS_LO
WER(A.DIMENSION3_),1,10),SUBSTR(NLS_LOWER(A.DIMENSION4_),1,10),SUBSTR(NLS_LOWER(A.
DIMENSION5_),1,10),SUBSTR(NLS_LOWER(A.DIMENSION6_),1,10),A.CREDITING ORDER BY 
SUBSTR(NLS_LOWER(A.ACCOUNTNUM),1,20),SUBSTR(NLS_LOWER(A.CURRENCYCODE),1,3),SUBST
R(NLS_LOWER(A.DIMENSION),1,10),SUBSTR(NLS_LOWER(A.DIMENSION2_),1,10),SUBSTR(NLS_LO
WER(A.DIMENSION3_),1,10),SUBSTR(NLS_LOWER(A.DIMENSION4_),1,10),SUBSTR(NLS_LOWER(A.
DIMENSION5_),1,10),SUBSTR(NLS_LOWER(A.DIMENSION6_),1,10),A.CREDITING
14 авг 09, 12:52    [7538785]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Как именно собирали статистику?
На крайний случай, outline никто не отменял, но это крайний случай. Думаю, в таком простом запросе Оракл и сам должен понять, если у него актуальная инфа на руках.
14 авг 09, 12:55    [7538817]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Тимур
вот что вижу в Oracle:
нда... Оракл наверное при виде такого просто умывает руки :)
14 авг 09, 12:58    [7538834]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
EXEC DBMS_STATS.GATHER_TABLE_STATS('AXDB50','LedgerTrans');
14 авг 09, 12:58    [7538835]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
а статистика по индексу?
14 авг 09, 12:58    [7538843]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Я не считаю этот запрос сложным. Никаких супер джойнов, рекурсий и т.д.
Запрос простой, просто много условий OR по одному полю
14 авг 09, 12:59    [7538852]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
В любом случае - ведь при анализе плана выполнения в Advise он находит индекс (по дате), который на 2 порядка ускоряет выборку...
14 авг 09, 13:01    [7538872]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Тимур
В любом случае - ведь при анализе плана выполнения в Advise он находит индекс (по дате), который на 2 порядка ускоряет выборку...
Т.е. ты выполнял запрос с реальными значениями переменных и получил выигрыш на 2 порядка?
14 авг 09, 13:04    [7538894]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
автор
а статистика по индексу?

В смысле? По какому индексу? По тому, котороый он находит после анализа в Advise Central?
14 авг 09, 13:05    [7538899]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
автор
Т.е. ты выполнял запрос с реальными значениями переменных и получил выигрыш на 2 порядка?


Я сужу по новому, расчитанному в Advise Central плану запроса.
В старом плане запроса: cost = 25606, time = 308 сек.
В новом плане запроса: cost = 230, time 3 сек.
14 авг 09, 13:09    [7538939]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Тимур
автор
а статистика по индексу?

В смысле? По какому индексу? По тому, котороый он находит после анализа в Advise Central?


Тот индекс, который ты хочешь, чтобы использовался
14 авг 09, 13:10    [7538950]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Oracle 10g
14 авг 09, 13:11    [7538953]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Тимур
Я сужу по новому, расчитанному в Advise Central плану запроса.
В старом плане запроса: cost = 25606, time = 308 сек.
В новом плане запроса: cost = 230, time 3 сек.
Но мы ведь понимаем, что все зависит от значений вот в этом условии ((TRANSDATE>=:in233) AND (TRANSDATE<=:in234)). И если передан большой диапазон дат, то доступ по индексу может быть неэффективным и наоборот. Поэтому надо брать реально используемые даты, подставлять в запрос и смотреть реальную производительность, а не виртуальную.
14 авг 09, 13:12    [7538964]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
автор

Тот индекс, который ты хочешь, чтобы использовался


Вот:

К сообщению приложен файл. Размер - 0Kb
14 авг 09, 13:17    [7539006]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
автор
Но мы ведь понимаем, что все зависит от значений вот в этом условии ((TRANSDATE>=:in233) AND (TRANSDATE<=:in234)). И если передан большой диапазон дат, то доступ по индексу может быть неэффективным и наоборот. Поэтому надо брать реально используемые даты, подставлять в запрос и смотреть реальную производительность, а не виртуальную.


Реальный период - месяц.
Это примерно 1\10 от общего объема данных
14 авг 09, 13:20    [7539032]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Тимур
Реальный период - месяц.
Это примерно 1\10 от общего объема данных
Ну так это существенный объем от общего и тут все зависит от фактора кластеризации индекса. Могу предположить что без индекса все-таки быстрее. Опять же, надо выполнять запрос с реальными значениями с fullscan, затем включать хинтом индекс, выполнять снова и смотреть на производительность.
14 авг 09, 13:26    [7539086]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
wurdu

Ну так это существенный объем от общего и тут все зависит от фактора кластеризации индекса.


И еще от db_file_multiblock_read_count. У Кайта есть примерчики с расчетами
14 авг 09, 13:29    [7539119]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
err_n
Member

Откуда:
Сообщений: 267
пересобирайте статистику, слишком большая разница в кардинальности для FTS и индекса.
14 авг 09, 14:04    [7539448]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
DВА
Member

Откуда:
Сообщений: 5439
вот и взрастил Оракл себе поколение "оптимизаторов" на адвайсерах :)
14 авг 09, 16:05    [7540542]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Никто никого не взрастил.
А если Вам нечего добавить по существу вопроса, то лучше промолчать ;)
14 авг 09, 17:19    [7541035]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить Oracle использовать индекс?  [new]
err_n
Member

Откуда:
Сообщений: 267
В любом случае можно посоветовать переписать заврос.
Расчет a: = :bind выдаст фиксированную селективность 1\num_distinct независимо от распределения данных в таблице. Добавить к этому общий курс тервера при котором селективность sel(a or b) = sel(a) + sel(b) - sel(a) *sel(b) и про корректную кардинальность вообще можно забыть.. )
14 авг 09, 17:37    [7541126]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить