powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Ликбез: как правильно курить план
20 сообщений из 20, страница 1 из 1
Ликбез: как правильно курить план
    #35762820
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Резко встала задача потюнинговать пару-тройку запросов. И тут обнаружился пробел
Может кто-то проявит альтруизм и пояснит популярно на пальцах методику улучшения запроса путем анализа плана?
Вот дрозофила:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table T1
(Id smallint not null constraint pkT1 primary key,
 Value varchar( 255 )
)

create table T2
(Id smallint not null constraint pkT2 primary key,
 Value varchar( 255 )
)

create table T3
(Id smallint not null constraint pkT3 primary key,
 Value varchar( 255 )
)
И, собственно говоря, три варианта запроса:
Код: 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.
/* 1 */
select
  *
from
  T1
where
  Id not in (select Id from T2)

/* 2 */
select
  *
from
  T1 T1
where
  not exists (select Id from T2 where Id=T1.Id)

/* 3 */
select
  *
from
  T1 T1
  left outer join T2 on (T2.Id=T1.Id)
where
  T2.Id is null
Планы - в attach'e. Вот исходя из каких критериев следует выбирать налилучший план запроса? Если посмотреть FINAL PLAN , то у 1-го и 2-го 1:1. А у 3-го - лучше
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
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35762842
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 Почитать FAQ этого форума
1.1. Определиться, какой у вас сервер ASA/ASE/IQ
1.2. Там кажется есть раздел про выращивание и употребление плана, по крайней мере для ASA.
2. у АСА план можно смотреть в графичском, текстовом укороченном и тектовом полном видах. Начните с графического плана и клацайте мышкой по квадратикам. Почитайте соответвующий раздел хелпа по чтению планов. Он небольшой но очень информативный.
3. АСЕ показывает план в текстов виде, но структуировано. Т.е. он вполне читабелен. У вас какой-то нечитабельный текст.
4. Обычно надо смотреть на:
- что-бы выполнении запроса использовались правильные индексы
- смотреть на то, как в плане оптимизатор оценил селективнойсть используемых параметров. Как правило, оптимизатор ошибается, если он не верно оценивает селективность параметров. Этот шаг как правило требуется, если оптимизатор лажает.
5. Критерием оптимальности обычно считается время выполнения запроса. Самый критичным у сервера ресурсом является производительность подсистемы ввода/вывода. Соответсвенно вся эта инженерия с планами и алгоритмами направлена на то, что-бы сэкономить ресурсы сервера в части опраций ввода/вывода, использования памяти, ресурсов процессора. У ASE в плане есть такие параметры как кол-во физических и логических операций чтения/записи. Я старался минимизировать параметры логического чтения и записи как общий критерий сложности запроса вообще. Физический ввод/вывод модет меняться в зависимости от состояния данных в кэше, и является уже производным от логического.
а аса к сожалению я не нашел параметра аналогичному АСЕшному кол-во логических операций чтения и записи.
- у каждого сервера есть разные механизмы реализации индексного поиска и соединения. Хэширование, index scan, параллельный скан и куча других опций. Я если честно, в эти дебри не лезу, хватает и вышеперечисленных приемов. Но рано или поздно прийдется пройти и через эти тонкости.
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35762843
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по плану, у вас все-таки АСЕ.
lru, mru - это стратегии импользования кэша - last recently used, most recently used.
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35762855
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35762863
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот несколько советов (mini-FAQ):
Запомните: оптимизатор не может оптимизировать все на свете запросы хорошо . Это просто невозможно.
Причины следующие :

Запросы бывают разные, в том числе и такие, которые в принципе не работают быстро.

Алгоритмы поиска оптимального плана имеют стоимости O(N!), где N - число таблиц в запросе. Это - очень сложные алгоритмы и трудоёмкие.

Оптимизатору же на поиск отводится очень мало времени.

Оптимизация (в основном) производится на основе статистических оценок распределения данных, которые всегда устаревшие и приблизительные. Эту статистику нельзя хранить всю целиком и точно, потому что в таком случае эти данные займут столько же места, сколько и основные данные, и на чтение их будет тратиться столько же времени.

Алгоритмы оптимизаторов во многом эвристичны и работают по принципу 80/20: примерно 80% запросов оптимизируется хорошо автоматически, остальные 20% не могут быть автоматически оптимизированы в принципе.

не стоит увлекаться трейс-флагами, показывающими процессы выбора индексов, выбора планов и прочими "внутренностями". Ваша задача - заставить оптимизатор выбрать хороший план, а не понять, почему он его не выбирает. Это -- информация скорее для разработчиков оптимизатора, чем для программиста. Есть только один момент, когда это нужно -- чтобы понять, почему некий набор похожих и оптимизируемых НЕ вручную запросов

Вы, как программист или DBA, должны уже сами знать, как должен выполняться ваш запрос и насколько он сложен. Это -- как ни странно, одна из главных составляющих успеха. Потому что плохо написанный запрос никогда не будет работать быстро.

(продолжение следует).
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35762976
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я на АСЕ работал последний раз около 5 лент назад. Помню, что планы смотрел а адвантаже, и в плане отображалась так-же статистика выполнения запросов. Правда как это делалось уже не помню, но вроде это режим был чуть ли не по умолчанию. А у вас во вложении есть отдельно чистый план, без стат. информации и жуткий результат трэйса. Поддержу MasterZivа - не надо трэйсов.

Судя по названию, lio и pio - это параметры о которых я говорил - логические и физические операции ввода/вывода.

Оптимальность плана не бывает абсолютной, в приведенном вами примере, оптимальность плана зависит от того, а сколько и какие реально величины хранятся в таблице и насколько они пересекаются. Т.е. в итоге вы сами должы знать заранее предполагать оптимальны план, как и сказал MasterZiv.

Выражу свое мнение.
Старайтесь избегать вложенных запросов типа Id not in (select Id from T2) и not exists (select Id from T2 where Id=T1.Id). Такие конструкции заставляют работать сервер в стиле foxpro: для каждой записи из основной таблицы запускается каждый раз подзапрос. лучше не надеяться, что случится чудо и оптимайзер чего-то там с оптимизирует. Сервер расчитан на операции со множествами, потоэму лучше сразу соединить обе таблицы по ключам и наложить фильтр - это как правило работает лучше и быстрее.
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35762992
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нсчет оптимизации логического ио. индекс существует для того, что-бы находить информацию за меньшее кол-во операций, в том числе и операций ввода-вывода. Написали запрос, запустили, смотрите в итого - сколько он вообще раз дергал страницы. Например 100. Переписали запрос и получилось 50, Это значит что этот запрос более был более экономичен, в первом приближении.
Физический ио от запуска к запуску будет менятся, т.к. в первый запуск меньше нужных страниц будет в кэше, а во второй больше, т.е. кол-во реальных обращений к винтам уменьшилось. Но для оценки общей сложности запроса фищический не подходит, а вот кол-во логических операций будет константно (хоят может быть ньюнсы, когда текущий план будет зависеть от доступных серверу в данный момент ресурсов. Но делать таке пируэты асешка не умеет, это свойственно асашке).
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35763704
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Ваша задача - заставить оптимизатор выбрать хороший план, а не понять, почему он его не выбирает.

Гм... IMHO, во-первых: для того, чтобы бороться с врагом, нужно его изучить. Во-вторых: для того, чтобы заставить оптимизатор выбрать хороший план, нужно же как-то выбрать этот самый хороший. Вот в дрозофиле: 1-й запрос - отпадает, понятное дело. А какой лучше/хуже: 2-й или 3-й? Исходя из каких критериев это определить?
MasterZiv
должны уже сами знать, как должен выполняться ваш запрос

Да вот как-то теория с практикой не сростается... Вот, 4 example:
Table T1 - 5 записей
Table T2 - 5000 записей
Table T3 - 50000 записей
и
Код: plaintext
\nselect\n*\nfrom\nT1\nleft outer join T2 on (T2.Id=T1.Id)\nleft outer join T3 on (T3.Id=T1.Id)\n
Пример гипотетический, но приблизительно такая ситуация в реальной жизни имела место. По идее, оптимально, в начале с\'join\'ить T1 и T2, а уж потом к полученному результату при\'join\'ивать T3. На деле же получается в начале join T2 и T3, а потом уже при\'join\'ивается T1.
Или, вот другой случай. Тогда как узнать как должен выполняться запрос?
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
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35763855
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Или, вот другой случай

Распишу, так сказать, на пальцах ( T1 && T2 ):
Код: plaintext
\ncreate table T4\n(\n   GroupId int not null,\n   Id int not null,\n   Val varchar( 256 ),\n   constraint pkT4 primary key(GroupId,Id)\n)\n
T1
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
\nselect\n  T1.*,\n  T4.*,\n  T2.*\nfrom\n  T1 T1\n  join T4 T4 on (T4.GroupId= 2 ) and (T4.Id=T1.Id)\n  join T2 T2 on (T2.Id=cast(T4.Val as int))\n
Что там получилось: если в начале сделать join T1 с T4, то тогда в T4 остаются только записи из GroupId=2 и cast при join\'е с T2 происходит без проблем. А оптимизатор решил в начале с\'join\'ить T4 с T2. Отсюда и

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
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35763958
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35764084
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35764464
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft пишет:

> Как было показано выше, вроде бы вполне логичные "...мои мысли - мои
> скакуны..." не всегда совпадают с мнением оптимизатора. Вот тут и встает
> вопрос: почему? кто из нас прав?

Он

> Давайте определимся с терминологией: что в Вашем понимании *разные*
> запросы? Которые синтаксически выглядят по разному? Для меня, если

Да. Этого достаточно.

Остальное - позже.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35764547
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BTW, вот ( вот ), что надыбал... ( отсюда )
/me думает: чем дальше в лес, тем толще партизаны...
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35765046
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft пишет:

> BTW, вот

Это ж про "Открыто об Oracle".
Оно конечно, многое во всех совр. оптимизаторах одинаково, но всё же.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35765057
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft пишет:


http://club.shelek.ru/viewart.php?id=305 -- а это надо читать очень
внимательно, потому что есть и верные утв., и ложные.
Хотя, так можно сказать про всё, что касается оптимизаторов.
Но мне эта статья скорее понравилась.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35766631
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мотивам получил

( 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.
( 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 ) )
теперь, вроде, видно, что с начала, если имеет место FIFO в описании, идет join T1 и T4, а потом к результату T2. А вот это

parallel 1

везде, что они выполняются в одной параллели? Т.е. последовательно? Т.е. если сдесь тока parallel 1 , то он весь выполняется последовательно, хотя, вроде, по его раскидистому дереву, некоторые ветки могли свободненько выполниться паралельно?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35774093
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ваш вопрос: Почему стоит "parallel 1"? "parallel 1"- говорит о том что ваши таблицы читаются не в параллеле, т.е одним процессом(без worker процессов)
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35991539
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 вклинивается не там, где нужно....
Может кто-то сталкивался с таким. В чем причина? На какие настройки сервера обратить внимание?
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35992199
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
set forceplan on
и частичный
Код: plaintext
plan
Using forceplan
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.
...
Рейтинг: 0 / 0
Ликбез: как правильно курить план
    #35992385
dace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SAV4SAV
А не смешали ли Вы
Код: plaintext
set forceplan on
и частичный
Код: plaintext
plan

Нет.
Был протестирован вариант только с использованием
Код: plaintext
set forceplan on
Но опять таже ситуация. У меня на тестовой все ок. У заказчика таже беда. Не знаю откуда "ноги" растут для tDocExt2.?!?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Ликбез: как правильно курить план
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]