|
|
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Резко встала задача потюнинговать пару-тройку запросов. И тут обнаружился пробел Может кто-то проявит альтруизм и пояснит популярно на пальцах методику улучшения запроса путем анализа плана? Вот дрозофила: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. N total cost1 3552 3553 165.7 Но если посмотреть ниже, то N lio pio cpu1 3 3 202 3 3 203 6 6 37 и т.д. Вот на что в первую очередь нужно смотреть при попытке анализа этих простыней? Далее: если запрос на несколько порядков позаковырестей (как на рисунке ) - там видно, что некоторые ветки, по идее, могут выполняться параллельно. Где это можно посмотреть? Вот такое обнаружил (по рисунку) ( sort ( group_hashing ( nl_join ( nested ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( nl_join ( i_scan PK_INSURANCE_AGENTS ( table ( IA INSURANCE_AGENTS ) ) ) ( i_scan PK_CONTRACT_PAY ( table ( CP CONTRACT_PAY ) ) ) ) ( i_scan OBJECT_I_C_CONTRACT_ID ( table ( OIC OBJECT_INSURANCE_CONTRACT ) ) ) ) ( i_scan PK_INSURANCE_PRODUCT ( table ( IP INSURANCE_PRODUCT ) ) ) ) ( i_scan PK_INSURANCE_PRODUCT_PARAM ( table ( IPP INSURANCE_PRODUCT_PARAM ) ) ) ) ( i_scan PK_CONTRACT ( table ( C CONTRACT ) ) ) ) ( i_scan CONTRACT_ADD_INFO_CONTRACT_ID ( table ( CAI CONTRACT_ADD_INFO ) ) ) ) ( nl_join ( i_scan PK_CLIENTS ( table ( C CLIENTS ) ( in ( view vC2 ) ) ) ) ( i_scan PK_CLIENT_PARAM ( table ( CP CLIENT_PARAM ) ( in ( view vC2 ) ) ) ) ) ) ( i_scan uk_CONTRACT_PAY_PAY_BANK ( table ( CPPB CONTRACT_PAY_PAY_BANK ) ) ) ) ( i_scan CONTRACT_AGENTS_CONTRACT_ID ( table ( CA CONTRACT_AGENTS ) ) ) ) ( i_scan PK_CLIENTS ( table ( C CLIENTS ) ( in ( view vC1 ) ) ) ) ) ( i_scan PK_CONTRACT_PARAM ( table CONTRACT_PARAM ( in ( view CT1 ) ( view vCAI ) ) ) ) ) ( i_scan INSURANCE_AGENTS_PARAM_MI ( table ( IAP INSURANCE_AGENTS_PARAM ) ) ) ) ( i_scan PK_CONTRACT_PARAM ( table CONTRACT_PARAM ( in ( view CT2 ) ( view vCAI ) ) ) ) ) ( subq ( scalar_agg ( nl_join ( nl_join ( nl_join ( i_scan ACTIVITY_R_R_IN_PAYMENT_ID ( table ( ARR ACTIVITY_REPORT_RELATIONS ) ) ) ( i_scan PK_ACTIVITY_REPORTS ( table ( AR ACTIVITY_REPORTS ) ) ) ) ( i_scan PK_CONTRACT_PAY ( table ( CP_IN CONTRACT_PAY ) ) ) ) ( i_scan PK_CONTRACT_PAY ( table ( CP_OUT CONTRACT_PAY ) ) ) ) ) ) ) ( i_scan PK_CLIENT_PARAM ( table ( CP CLIENT_PARAM ) ( in ( view vC1 ) ) ) ) ) ) ) ( prop ( table ( IA INSURANCE_AGENTS ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CP CONTRACT_PAY ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( OIC OBJECT_INSURANCE_CONTRACT ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( IP INSURANCE_PRODUCT ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( IPP INSURANCE_PRODUCT_PARAM ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( C CONTRACT ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CAI CONTRACT_ADD_INFO ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( C CLIENTS ) ( in ( view vC2 ) ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CP CLIENT_PARAM ) ( in ( view vC2 ) ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CPPB CONTRACT_PAY_PAY_BANK ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CA CONTRACT_AGENTS ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( C CLIENTS ) ( in ( view vC1 ) ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table CONTRACT_PARAM ( in ( view CT1 ) ( view vCAI ) ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( IAP INSURANCE_AGENTS_PARAM ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table CONTRACT_PARAM ( in ( view CT2 ) ( view vCAI ) ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( ARR ACTIVITY_REPORT_RELATIONS ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( AR ACTIVITY_REPORTS ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CP_IN CONTRACT_PAY ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CP_OUT CONTRACT_PAY ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( CP CLIENT_PARAM ) ( in ( view vC1 ) ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) Здесь? Как? Сидеть считать скобочки? (это я, конечно, утрирую). В опчем: помогите кто чем может - не дайте помереть безграмотным _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 13:35 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
1 Почитать FAQ этого форума 1.1. Определиться, какой у вас сервер ASA/ASE/IQ 1.2. Там кажется есть раздел про выращивание и употребление плана, по крайней мере для ASA. 2. у АСА план можно смотреть в графичском, текстовом укороченном и тектовом полном видах. Начните с графического плана и клацайте мышкой по квадратикам. Почитайте соответвующий раздел хелпа по чтению планов. Он небольшой но очень информативный. 3. АСЕ показывает план в текстов виде, но структуировано. Т.е. он вполне читабелен. У вас какой-то нечитабельный текст. 4. Обычно надо смотреть на: - что-бы выполнении запроса использовались правильные индексы - смотреть на то, как в плане оптимизатор оценил селективнойсть используемых параметров. Как правило, оптимизатор ошибается, если он не верно оценивает селективность параметров. Этот шаг как правило требуется, если оптимизатор лажает. 5. Критерием оптимальности обычно считается время выполнения запроса. Самый критичным у сервера ресурсом является производительность подсистемы ввода/вывода. Соответсвенно вся эта инженерия с планами и алгоритмами направлена на то, что-бы сэкономить ресурсы сервера в части опраций ввода/вывода, использования памяти, ресурсов процессора. У ASE в плане есть такие параметры как кол-во физических и логических операций чтения/записи. Я старался минимизировать параметры логического чтения и записи как общий критерий сложности запроса вообще. Физический ввод/вывод модет меняться в зависимости от состояния данных в кэше, и является уже производным от логического. а аса к сожалению я не нашел параметра аналогичному АСЕшному кол-во логических операций чтения и записи. - у каждого сервера есть разные механизмы реализации индексного поиска и соединения. Хэширование, index scan, параллельный скан и куча других опций. Я если честно, в эти дебри не лезу, хватает и вышеперечисленных приемов. Но рано или поздно прийдется пройти и через эти тонкости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 14:17 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Судя по плану, у вас все-таки АСЕ. lru, mru - это стратегии импользования кэша - last recently used, most recently used. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 14:20 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ggg_old Определиться, какой у вас сервер ASA/ASE/IQ I'm so sorry select @@version Adaptive Server Enterprise/15.0.2/EBF 14332/P/NT (IX86)/Windows 2000/ase1502/2486/32-bit/OPT/Thu May 24 04:10:36 2007 Ggg_old Начните с графического плана и клацайте мышкой по квадратикам Ну... Думаю по рисунку Вы догадались, что я так и делаю. Только вот засада: я такое могу проделать тока на своем локальном серваке 15-ке. А на боевом 12-ке вся эта кольоровость - недоступна. По сему и приходица рыться в тексте. Ggg_old Т.е. он вполне читабелен. У вас какой-то нечитабельный текст. "...маємо те, що маємо...": маленькая простыня результат потуг set showplan on , большая dbcc traceon(3604, /*302,*/ 310) (302, как видите - за'rem'ил.) С 302 вообще как в том анеке: "...такие зверюги - им вообще автоматы не дают..." Ggg_old что-бы выполнении запроса использовались правильные индексы Вот как раз на это смотрю и подгоняю в первую очередь. Но, согласно малюнку, все - зеленое (index scan) Ggg_old смотреть на то, как в плане оптимизатор оценил селективнойсть используемых параметров ткните носом в простыню, pls... Ggg_old Критерием оптимальности обычно считается время выполнения запроса. В принципе - да. Но ЭстЪ ньюансы: нагрузка на сервак, блокировки... Ggg_old старался минимизировать параметры логического чтения и записи как общий критерий сложности запроса вообще Внимание - вопрос: посредством чего? Если, 4 example, страниц много данные выборки по ним разбросаны и происходит интенсивное вытеснение из кеша? Только индекс? Или есть ышо какие-то механизмы. Вот это хотелось бы чтобы озвучили. 4 example, я делаю пару-тройку join'ов и вижу, что если с'join'ить так, то, по идее, д.б. лучче. Вот как мне сказать "...ты туда не ходи, ты сюда ходи..."? хинты? Ggg_old рано или поздно прийдется пройти и через эти тонкости Ну вот воно - вже... Просто все буквари/мануалы по этой теме носят описательный характер. Я, конечно, понимаю, что все зависит от конкретно взятых данных и запросов. Но все же можно же привести какую-нить дрозофилу и на пальцах показать: смотрим на это и это, а уж потом на это и то. Ведь оптимизация многокритериальная. Т.е. одно у одного м.б. лучше, а у другого - другое. И что тогда предпочесть? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 14:51 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Вот несколько советов (mini-FAQ): Запомните: оптимизатор не может оптимизировать все на свете запросы хорошо . Это просто невозможно. Причины следующие : Запросы бывают разные, в том числе и такие, которые в принципе не работают быстро. Алгоритмы поиска оптимального плана имеют стоимости O(N!), где N - число таблиц в запросе. Это - очень сложные алгоритмы и трудоёмкие. Оптимизатору же на поиск отводится очень мало времени. Оптимизация (в основном) производится на основе статистических оценок распределения данных, которые всегда устаревшие и приблизительные. Эту статистику нельзя хранить всю целиком и точно, потому что в таком случае эти данные займут столько же места, сколько и основные данные, и на чтение их будет тратиться столько же времени. Алгоритмы оптимизаторов во многом эвристичны и работают по принципу 80/20: примерно 80% запросов оптимизируется хорошо автоматически, остальные 20% не могут быть автоматически оптимизированы в принципе. не стоит увлекаться трейс-флагами, показывающими процессы выбора индексов, выбора планов и прочими "внутренностями". Ваша задача - заставить оптимизатор выбрать хороший план, а не понять, почему он его не выбирает. Это -- информация скорее для разработчиков оптимизатора, чем для программиста. Есть только один момент, когда это нужно -- чтобы понять, почему некий набор похожих и оптимизируемых НЕ вручную запросов Вы, как программист или DBA, должны уже сами знать, как должен выполняться ваш запрос и насколько он сложен. Это -- как ни странно, одна из главных составляющих успеха. Потому что плохо написанный запрос никогда не будет работать быстро. (продолжение следует). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 15:02 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Я на АСЕ работал последний раз около 5 лент назад. Помню, что планы смотрел а адвантаже, и в плане отображалась так-же статистика выполнения запросов. Правда как это делалось уже не помню, но вроде это режим был чуть ли не по умолчанию. А у вас во вложении есть отдельно чистый план, без стат. информации и жуткий результат трэйса. Поддержу MasterZivа - не надо трэйсов. Судя по названию, lio и pio - это параметры о которых я говорил - логические и физические операции ввода/вывода. Оптимальность плана не бывает абсолютной, в приведенном вами примере, оптимальность плана зависит от того, а сколько и какие реально величины хранятся в таблице и насколько они пересекаются. Т.е. в итоге вы сами должы знать заранее предполагать оптимальны план, как и сказал MasterZiv. Выражу свое мнение. Старайтесь избегать вложенных запросов типа Id not in (select Id from T2) и not exists (select Id from T2 where Id=T1.Id). Такие конструкции заставляют работать сервер в стиле foxpro: для каждой записи из основной таблицы запускается каждый раз подзапрос. лучше не надеяться, что случится чудо и оптимайзер чего-то там с оптимизирует. Сервер расчитан на операции со множествами, потоэму лучше сразу соединить обе таблицы по ключам и наложить фильтр - это как правило работает лучше и быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 18:55 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
нсчет оптимизации логического ио. индекс существует для того, что-бы находить информацию за меньшее кол-во операций, в том числе и операций ввода-вывода. Написали запрос, запустили, смотрите в итого - сколько он вообще раз дергал страницы. Например 100. Переписали запрос и получилось 50, Это значит что этот запрос более был более экономичен, в первом приближении. Физический ио от запуска к запуску будет менятся, т.к. в первый запуск меньше нужных страниц будет в кэше, а во второй больше, т.е. кол-во реальных обращений к винтам уменьшилось. Но для оценки общей сложности запроса фищический не подходит, а вот кол-во логических операций будет константно (хоят может быть ньюнсы, когда текущий план будет зависеть от доступных серверу в данный момент ресурсов. Но делать таке пируэты асешка не умеет, это свойственно асашке). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2009, 19:09 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
MasterZiv Ваша задача - заставить оптимизатор выбрать хороший план, а не понять, почему он его не выбирает. Гм... IMHO, во-первых: для того, чтобы бороться с врагом, нужно его изучить. Во-вторых: для того, чтобы заставить оптимизатор выбрать хороший план, нужно же как-то выбрать этот самый хороший. Вот в дрозофиле: 1-й запрос - отпадает, понятное дело. А какой лучше/хуже: 2-й или 3-й? Исходя из каких критериев это определить? MasterZiv должны уже сами знать, как должен выполняться ваш запрос Да вот как-то теория с практикой не сростается... Вот, 4 example: Table T1 - 5 записей Table T2 - 5000 записей Table T3 - 50000 записей и Код: plaintext Или, вот другой случай. Тогда как узнать как должен выполняться запрос? MasterZiv Потому что плохо написанный запрос никогда не будет работать быстро. Это понятно? Но как определить, что он плохо написан? По in (select )? Это хорошо, если это ЭстЪ? А если - нЭт. MasterZiv (продолжение следует) Это - радует. Только, вот, все равно хочется немного от теории перейти к практике. Ggg_old Старайтесь избегать вложенных запросов типа Id not in (select Id from T2) и not exists (select Id from T2 where Id=T1.Id) Да, вот, как раз попалось на глаза . И решил на этих кошках потренироваться... BTW, прогнал их же в IBExpert\'е (там тоже неплохо организован анализ планов) - дык там шо not exists, шо left join - 1:1-му _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2009, 23:50 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ex_Soft Или, вот другой случай Распишу, так сказать, на пальцах ( T1 && T2 ): Код: plaintext IdValue1\'1_T1\'2\'2_T1\'3\'3_T1\'4\'4_T1\'5\'5_T1\' T2 IdValue1\'1_T2\'3\'3_T2\'5\'5_T2\' T4 GroupIdIdVal11\'string value #1_1\'12\'string value #1_2\'13\'string value #1_3\'21\'1\'22\'3\'23\'5\'31\'string value #3_1\'32\'string value #3_2\'33\'string value #3_3\' Код: plaintext Syntax error during explicit conversion of VARCHAR value \'string value #1_1\' to a INT field. Вот что ему нуна было сказать, чтобы он в начале join\'ил T1 с T4? _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 08:15 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ex_Soft пишет: > Гм... IMHO, во-первых: для того, чтобы бороться с врагом, нужно его > изучить. Во-вторых: для того, чтобы заставить оптимизатор выбрать > хороший план, нужно же как-то выбрать этот самый хороший. Вот надо уметь работать ЗА оптимизатор. Вот в > дрозофиле: 1-й запрос - отпадает, понятное дело. А какой лучше/хуже: 2-й > или 3-й? Исходя из каких критериев это определить? В примере 3 запроса полностью эквивалентны. Оптимизатор может выбрать для них вообще один план, если умный. NOT IN и NOT EXISTS ASE точно распознаёт как одинаковые. Вычитание через LEFT JOIN -- я не знаю, потому как никогда так не пишу, и считаю это дурным тоном -- есть нормальные способы выражения вычитания, NOT IN и NOT EXISTS. К тому же о планах РАЗНЫХ запросов рассуждать бессмысленно, но этот случай, правда, исключение. > Это понятно? Но как определить, что он плохо написан? По in (select )? См. п. 1. Нет, конечно, постепенно надо въезжать в это и придёт понимание. > Старайтесь избегать вложенных запросов типа Id not in (select Id from > T2) и not exists (select Id from T2 where Id=T1.Id) Вот следующий пункт будет - "старайтесь избегать правил типа "Старайтесь избегать вложенных запросов типа Id not in (select Id from T2) и not exists (select Id from T2 where Id=T1.Id)", потому что они не работают". Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 09:43 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
MasterZiv надо уметь работать ЗА оптимизатор Как было показано выше, вроде бы вполне логичные "...мои мысли - мои скакуны..." не всегда совпадают с мнением оптимизатора. Вот тут и встает вопрос: почему? кто из нас прав? MasterZiv о планах РАЗНЫХ запросов рассуждать бессмысленно Давайте определимся с терминологией: что в Вашем понимании разные запросы? Которые синтаксически выглядят по разному? Для меня, если запросы, на одном и том же множестве исходных данных возвращают одинаковый результат - одинаковы и сопоставимы. В конце концов: оптимизация - процесс итерационный. Тогда, получается, результаты каждой итерации не имеет смысла сравнивать. А как же тогда быть? Вот на пальцах: у меня не слабый запрос с кучей join'ов, агрегированием и условий. И одно из условий NOT IN. Я заменил его на NOT EXIST (LEFT JOIN). Это уже разные запросы? Другой пример: пара-тройка join'ов используется многократно и в нескольких местах - оформил как view и, соответственно, заменил в запросе. Это тоже уже будут разные запросы? Получается оптимизация тогда тока и заключается в том, чтобы индекса только прикручивать, оставляя при этом зам запрос неизменным? Т.е. если я добился, грубо говоря, везде index scan и запрос, все равно вводит сервак в down, то списываем его как на неоптимизируемый и умываем руки? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 10:46 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ex_Soft пишет: > Как было показано выше, вроде бы вполне логичные "...мои мысли - мои > скакуны..." не всегда совпадают с мнением оптимизатора. Вот тут и встает > вопрос: почему? кто из нас прав? Он > Давайте определимся с терминологией: что в Вашем понимании *разные* > запросы? Которые синтаксически выглядят по разному? Для меня, если Да. Этого достаточно. Остальное - позже. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 13:00 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
BTW, вот ( вот ), что надыбал... ( отсюда ) /me думает: чем дальше в лес, тем толще партизаны... _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 13:22 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ex_Soft пишет: > BTW, вот Это ж про "Открыто об Oracle". Оно конечно, многое во всех совр. оптимизаторах одинаково, но всё же. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 15:43 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ex_Soft пишет: http://club.shelek.ru/viewart.php?id=305 -- а это надо читать очень внимательно, потому что есть и верные утв., и ложные. Хотя, так можно сказать про всё, что касается оптимизаторов. Но мне эта статья скорее понравилась. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2009, 15:46 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
По мотивам получил ( nl_join ( nl_join ( i_scan pkT4 ( table ( T4 T4 ) ) ) ( i_scan pkT1 ( table ( T1 T1 ) ) ) ) ( i_scan pkT2 ( table ( T2 T2 ) ) ) ) ( prop ( table ( T4 T4 ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( T1 T1 ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) ( prop ( table ( T2 T2 ) ) ( parallel 1 ) ( prefetch 2 ) ( lru ) ) "посчитал скобочки" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. parallel 1 везде, что они выполняются в одной параллели? Т.е. последовательно? Т.е. если сдесь тока parallel 1 , то он весь выполняется последовательно, хотя, вроде, по его раскидистому дереву, некоторые ветки могли свободненько выполниться паралельно? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2009, 11:37 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ваш вопрос: Почему стоит "parallel 1"? "parallel 1"- говорит о том что ваши таблицы читаются не в параллеле, т.е одним процессом(без worker процессов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2009, 15:22 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
Ситуевина вот какая: Существует запрос, в котором используются следующие таблицы: tSetup, tDoc, tDocExt, tAcc, tDocExt2, tAddParamF (между собой соединяются по индексированным полям). В проце прописан абстрактный план для запроса: plan "(g_join (scan tSetup) (scan tDoc) (scan tDocExt) (scan tAcc) (scan tDocExt2))" Запускаю процу и просматриваю реальный план выполнения. На тестовых базах все отлично срабатывает по плану (порядок таблиц такой tSetup->tDoc->tDocExt->tAcc->tDocExt2->tAddParamF). Но на реальном сервере заказчика в реальном плане выполнения отличается порядок таблиц. Картина там такая tSetup->tDoc->tDocExt2->tDocExt->tAcc2->tAddParamF Какого лешего tDocExt2 вклинивается не там, где нужно.... Может кто-то сталкивался с таким. В чем причина? На какие настройки сервера обратить внимание? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 13:42 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
daceСитуевина вот какая: Существует запрос, в котором используются следующие таблицы: tSetup, tDoc, tDocExt, tAcc, tDocExt2, tAddParamF (между собой соединяются по индексированным полям). В проце прописан абстрактный план для запроса: plan "(g_join (scan tSetup) (scan tDoc) (scan tDocExt) (scan tAcc) (scan tDocExt2))" Запускаю процу и просматриваю реальный план выполнения. На тестовых базах все отлично срабатывает по плану (порядок таблиц такой tSetup->tDoc->tDocExt->tAcc->tDocExt2->tAddParamF). Но на реальном сервере заказчика в реальном плане выполнения отличается порядок таблиц. Картина там такая tSetup->tDoc->tDocExt2->tDocExt->tAcc2->tAddParamF Какого лешего tDocExt2 вклинивается не там, где нужно.... Может кто-то сталкивался с таким. В чем причина? На какие настройки сервера обратить внимание? А не смешали ли Вы Код: plaintext Код: plaintext If set forceplan on is in effect, and query association is also enabled for the session, forceplan is ignored if a full abstract plan is used to optimize the query. If a partial plan does not completely specify the join order: ·First, the tables in the abstract plan are ordered, as specified. ·The remaining tables are ordered as specified in the from clause. ·The two lists of tables are merged. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 16:51 |
|
||
|
Ликбез: как правильно курить план
|
|||
|---|---|---|---|
|
#18+
SAV4SAV А не смешали ли Вы Код: plaintext Код: plaintext Нет. Был протестирован вариант только с использованием Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 17:42 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=38&tid=2011033]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
2ms |
| others: | 34ms |
| total: | 228ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...