01.02.2006, 11:38 | #1 |
Участник
|
Доброго дня всем!
Вот такой запрос я вижу в Oracle: SELECT /*+ FIRST_ROWS*/ A.PRODID ,A.HEADPRODID ,A.ITEMID ,A.NAME ,A.QTYSCHED ,A.PRODSTATUS ,A.NOTE_FX ,A.RECID FROM PRODTABLE A WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER(:in1)) AND (SUBSTR(NLS_LOWER(NVL(LTRIM(PRODID),PRODID)),1,30) LIKE NLS_LOWER(:in2) ESCAPE '\' )) ORDER BY SUBSTR(NLS_LOWER(A.DATAAREAID),1,3),SUBSTR(NLS_LOWER(A.PRODID),1,30) С вполне сносным планом выполнения: Operation _____________ Object _____ Cost ____ Time (sec) ____ CPU Cost ______ I/O Cost (3)SELECT STATEMENT_______________167,276 (2)TABLE ACCESS BY INDEX ROWID _______ PRODTABLE ___ 167,275 ____ 2,008 ______ 1,809,128,461 ___ 167,022 (1)INDEX RANGE SCAN I_262PRODIDX _ 2,670 ______ 33 _________ 99,919,944 _____ 2,656 Все вроде бы ничего, за искоючением вот этой строчки в запросе, которая меня смущает (вернее меня смутила высока стоимость по CPU, а уж потом я увидел это) SUBSTR(NLS_LOWER(NVL(LTRIM(PRODID),PRODID)),1,30) мне это показалось странным, так как индекс построен как SUBSTR(NLS_LOWER(A.PRODID),1,30) и хотя запрос использует индекс стоимость его испльзования достаточно велика... Как временное решение я построил дополнительный индекс с SUBSTR(NLS_LOWER(NVL(LTRIM(PRODID),PRODID)),1,30) и стоимость запроса (и естественно время обработки) упала Operation _____________ Object _____ Cost ____ Time (sec) ____ CPU Cost ______ I/O Cost (4)SELECT STATEMENT ______________ 24,056 (3)SORT ORDER BY _________________ 24,056 ______ 289 ________381,155,034 _____ 24,003 (2)TABLE ACCESS BY INDEX ROWID_______ PRODTABLE ____ 1,425 ________ 18 _________ 11,646,303 ______ 1,424 (1)INDEX RANGE SCAN I_262PRODIDX_AD 17 _________ 1 ________ 1,175,077 ________ 17 Может кто пояснит почему Аксапта так странно себя ведет - создает индексы с одним набором функций, а запросы строит с другим? Справочно: Oracle 10gR1 server Axapta 3.0 AOS в системе используется выравнивание справо. Спасибо. ЗЫ. Программисты говорят что они такого не писали и даже не знают как такое написать на языке Аксапты и это, типа, стандартный функционал Аксапты. |
|
01.02.2006, 12:06 | #2 |
Шаман форума
|
Лучше поставить выравнивание "слева"
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
01.02.2006, 12:39 | #3 |
Участник
|
то что это лучше - понятно...
но... никто на енто не пойдет... наверное... |
|
02.02.2006, 12:43 | #4 |
Шаман форума
|
Это настолько принципиально? Здесь на сайте была даже где-то статья про оптимизацию производительности - там в том числе было и про "правое" и "левое" выравнивание - попробуйте поиск!
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
02.02.2006, 13:22 | #5 |
Участник
|
вопрос-то был не про правое и левое выравнивание, а про то почему Аксапта так криво строит собственные запросы...
даже если я сделаю левое выравнивание, то это никаким образом не скажется на построение индекса и формирование запросомв - поменяется только обьем хранение информации... или я не прав? |
|