Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
(написанное ниже прошу расценивать как информацию к размышлению). Код: plaintext 1. явно неоптимальный план запроса. Описаны условия возникновения, солюшены. Код: plaintext 1. Версии IDS, на которых тестировалось: 7.31.UD8, 9.40.UC8, 11.50.FC1TL . Параметры конфига IDS, касающиеся оптимизатора: Код: plaintext 1. 2. 3. 4. 5. 6. Таблица, на которой проявился эффект: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Количество строк в таблице: Код: plaintext 1. 2. 3. 4. Из них (как выяснилось), эффект проявляется примерно на 700 строках (+/-). Простой запрос, на котором "спотыкается" оптимизатор (далее - "глючный" ): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Тот же запрос, но з другим значением в фильтре, на нем оптимизатор ведет себя предсказуемо: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Код: plaintext 1. 2. 3. 1) значением в фильтре WHERE 2) Estimated Cost: 939558 против 10 3) используемым оптимизатором индексом: "Index Keys: id_line" против "Index Keys: id_doc" 4) (как следствие 2) ) - временем выполнения: ~1мин. против долей секунды Код: plaintext 1. 2. 3. которые, согласно имеющемуся распределению данных в таблице, имеют низкую избирательность фильтра. А именно, если посмотреть в "data distibution" по этому столбцу таблицы: Код: plaintext 1. 2. 3. 4. только на bin's, в которых значение второго поля (кол-во уникальных значений в bin) меньше некоторого числа (в данном случае < 36): значение из первого запроса (13406526) попадает в 170й bin: Код: plaintext 1. 2. 3. А также на значениях из "data distribution", попавших в bin's из раздела OVERFLOW. (в терминах "обычных" bin-ов там число во втором поле вообще было бы < 1 ). Таким образом, получается, что оптимизатор выбирает другой индекс при условии низкой селективности фильтра для конкретного его значения. НО! Что удивительно для меня: получившееся значение "Estimated Cost", превышающее такое же для случая использования другого индекса в ~1000 - 100 000 раз (!) его НЕ СМУЩАЮТ :) Код: plaintext 1. 2. 3. Код: plaintext б) использование директивы оптимизатора INDEX для принудительного выбора "правильного" индекса: Код: 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. Код: plaintext 1. 2. 3. В этом случае распределение по bin'ам получается более равномерное, но кол-во bin'ов в разделе OVERFLOW вырастает (до ~700) и на них "глюк" все равно имеет место быть. б) Изменение переменной конфига OPTCOMPIND в) Использование директивы оптимизатора ALL_ROWS (что тоже удивительно, исходя из положительного эффекта от "OPT_GOAL -1"): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Код: plaintext 1. 2. 3. OPT_GOAL и "имеет право на ошибку" (неоптимальный выбор плана запроса). И в каждом конкретном случае дело программиста - тюнинговать ли конкретный запрос директивами... Но, пардон, не до такой же степени "промахиваться": итоговая разница между Estimated Cost запроса с "автооптимизацией" и "без" (939558 против 1276) просто ужасает... :) А главное: никогда нельзя быть уверенным, не "тормознет" ли на каком-то конкретном значении (комбинации значений) фильтра тот или иной запрос... Всего же не протестируешь... Думаю, это один из примеров, из-за которых в частности наши программисты недолюбливают Informix... PS. Сразу же отвечу на логичную реплику "так поставьте OPT_GOAL=-1 и будет вам щастье!": нет, из пушки по воробьям не стреляют. По мне так логичнее сделать, чтобы действительно работала директива оптимизатора {+ALL_ROWS}. А еще лучше, чтоб он был более интеллектуальным и не допускал слишком большой разницы между Estimated Cost при подборе вариантов плана запроса. Иными словами, при некоторых условиях выгоднее не следовать тупо поведению, заданному переменной конфига OPT_GOAL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 18:29 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Денис, ты где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 19:43 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Art S. KagelДенис, ты где? я тут. А тебе Арти чего не спится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 20:41 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
svat2 sd_lines_distribution.txt целиком выложите а, а то я половину не понял? WHERE id_doc = 13406526 Estimated # of Rows Returned: 2651 WHERE id_doc = 13437160 Estimated # of Rows Returned: 25 т.е. 2651 и 25 правильные так? стоимость = 939558 я думаю правильная. Надо обойти практически весь индекс и всю таблицу. svat2SELECT {+EXPLAIN, AVOID_EXECUTE} Estimated Cost: 939558 Estimated # of Rows Returned: 2651 SELECT {+EXPLAIN, AVOID_EXECUTE, INDEX (sd_lines r287_1961)} Temporary Files Required For: Order By Estimated Cost: 1276 Estimated # of Rows Returned: 2651 вот это интересно, да. Теоретически надо брать план с меньшей стоимостью. svat2 Думаю, это один из примеров, из-за которых в частности наши программисты недолюбливают Informix...Завидую вашим программерам. А они какую субд порекомендуют? С безглючным оптимизатором? /topic/480339 /topic/348785 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 21:12 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
svat2 Думаю, это один из примеров, из-за которых в частности наши программисты недолюбливают Informix... Программисты?!?! По своему опыту, мне казалось, что Informix недолюбливали DBA (сисадмины) за его "графический" интерфейс и "обилие" литературы (IBM привет) . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 21:57 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис svat2SELECT {+EXPLAIN, AVOID_EXECUTE} Estimated Cost: 939558 Estimated # of Rows Returned: 2651 SELECT {+EXPLAIN, AVOID_EXECUTE, INDEX (sd_lines r287_1961)} Temporary Files Required For: Order By Estimated Cost: 1276 Estimated # of Rows Returned: 2651 вот это интересно, да. Теоретически надо брать план с меньшей стоимостью. А нет, не интересно. Супруга мне подсказывает, что сортировка очень дорогая операция, и этот план был откинут на раннем этапе режима оптимизации first_rows потому как надо сортировать слишком много (аж 2651) строку (тут была ирония да). Т.е. все абсолютно предсказуемо и правильно в оптимизаторе в некотором смысле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 22:42 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис svat2 sd_lines_distribution.txt целиком выложите а, а то я половину не понял? cм. в прицепе (распределение по другим полям таблицы вырезано). Журавлев Денис WHERE id_doc = 13406526 Estimated # of Rows Returned: 2651 WHERE id_doc = 13437160 Estimated # of Rows Returned: 25 т.е. 2651 и 25 правильные так? как "Estimated" - да, правильные. А реально (повод улыбнуться проделкам Случая) даже совсем наоборот :) : Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 10:32 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. Если еще подумать, то оптимизатор-то прав, безумно прав: Мы хотим первые строки, просим первые! Стоимость получения первой строки (в этом плане): 939558/2651 = 354 (т.е. <1276) (при таком плане такой расчет допустим, во втором случае с Temporary Files Required For: Order By так делить нельзя, и стоимость получения первой строки и вообще всех = 1276). Таким образом если таблица нормализована и вся лежит на диске (со стандартным временем отклика и процессор со стандартной частотой), первую строку мы увидим раньше при плане со стоимостью 939558 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 10:43 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
svat2 Код: plaintext 1. 2. 3. Код: plaintext Код: plaintext 1. 2. 3. в) Использование директивы оптимизатора ALL_ROWS (что тоже удивительно, исходя из положительного эффекта от "OPT_GOAL -1"): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Код: plaintext 1. 2. 3. PS. По мне так логичнее сделать, чтобы действительно работала директива оптимизатора {+ALL_ROWS}. Поведение оптимзатора оправдать можно не во всех упомянутых случаях. Расстраивает и удивляет именно вот это исключение (читаем ещё раз цитату): ПОМОГАЕТ OPT_GOAL -1, но НЕ ПОМОГАЕТ использование директивы оптимизатора ALL_ROWS... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 11:03 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
АнатоЛой Поведение оптимзатора оправдать можно не во всех упомянутых случаях. Расстраивает и удивляет именно вот это исключение (читаем ещё раз цитату): ПОМОГАЕТ OPT_GOAL -1, но НЕ ПОМОГАЕТ использование директивы оптимизатора ALL_ROWS... :( можно использовать: set optimization all_rows; А на половине запросов ansi синтаксисом не работает директива +explain . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 11:14 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис Код: plaintext 1. 2. 3. 4. 5. 6. 7. Если еще подумать, то оптимизатор-то прав, безумно прав... причем "БЕЗУМНО" - ключевое слово :-) ЗЫ. с выкладками согласен полностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 11:18 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис можно использовать: set optimization all_rows; попробовал использовать. Да, такой вариант "помогает": Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 11:26 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
svat2 причем "БЕЗУМНО" - ключевое слово :-) ЗЫ. с выкладками согласен полностью. я бы сказал что стоимость сортировки несколько завышена. откуда получается 1276 для 2651 строк надо читать тут: http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.perf.doc/perf292.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 12:06 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
sysmaster svat2 Думаю, это один из примеров, из-за которых в частности наши программисты недолюбливают Informix... Программисты?!?! По своему опыту, мне казалось, что Informix недолюбливали DBA (сисадмины) за его "графический" интерфейс и "обилие" литературы (IBM привет) . Литература по информиксу (документация) одна из лучших. А насчет "графического интерфейса" - "все великие дела делались в командной строке" (С). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 19:54 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Выбегалло sysmaster svat2 Думаю, это один из примеров, из-за которых в частности наши программисты недолюбливают Informix... Программисты?!?! По своему опыту, мне казалось, что Informix недолюбливали DBA (сисадмины) за его "графический" интерфейс и "обилие" литературы (IBM привет) . Литература по информиксу (документация) одна из лучших. А насчет "графического интерфейса" - "все великие дела делались в командной строке" (С). Это не мое личное мнение, это мнение тех людей, с которыми мне приходилось общаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 21:03 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Журавлев Денися бы сказал что стоимость сортировки несколько завышена. А это у информикса было всегда - оптимизатор (, наверное, еще с древних времен, когда памяти было мало, сортировка всегда требовала временного пространства на диске) всегда жутко боялся сортировок и при первом удобном случае ее избегал (использованием соответствующего индекса, хоть и огромного, как в данном случае). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2008, 16:05 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
vasilis Журавлев Денися бы сказал что стоимость сортировки несколько завышена. А это у информикса было всегда - оптимизатор (, наверное, еще с древних времен, когда памяти было мало, сортировка всегда требовала временного пространства на диске) всегда жутко боялся сортировок и при первом удобном случае ее избегал (использованием соответствующего индекса, хоть и огромного, как в данном случае). вот тут скупо описано: libA sort requires in-memory work as well as disk work. The in-memory work depends on the number of columns that are sorted, the width of the combined sort key, and the number of row combinations that pass the query filter. Use the following formula to calculate the in-memory work that a sort operation requires: не понятно как посчитать где будем сортировать в памяти или на диске. libWm = (c * Nfr) + (w * Nfrlog2(Nfr)) Wm is the in-memory work. c is the number of columns to order and represents the costs to extract column values from the row and concatenate them into a sort key. w is proportional to the width of the combined sort key in bytes and stands for the work to copy or compare one sort key. A numeric value for w depends strongly on the computer hardware in use. Где посмотреть это загадочное w для инстанса? lib Nfr is the number of rows that pass the query filter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2008, 16:29 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис libA sort requires in-memory work as well as disk work. The in-memory work depends on the number of columns that are sorted, the width of the combined sort key, and the number of row combinations that pass the query filter. Use the following formula to calculate the in-memory work that a sort operation requires: не понятно как посчитать где будем сортировать в памяти или на диске. Да, похоже, что заранее оптимизатор это не может определить, соответственно, боится дисковых операций даже там, где их нет. Хотя, наверное, мог бы, по крайней мере, для небольших выборок. Журавлев Денис Где посмотреть это загадочное w для инстанса? Если мне не изменяет память, то в старых (прошлого века :) материалах этот очень условный коэффициент равнялся 0,03 и был одинаковый для всех железяк. Возможно потом что то изменилось... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2008, 16:53 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
vasilisЕсли мне не изменяет память, то в старых (прошлого века :) материалах этот очень условный коэффициент равнялся 0,03 и был одинаковый для всех железяк. Возможно потом что то изменилось... Вот нашел. Память меня пока не подвела :) --------------- Используемая при вычислении стоимости формула основывается на стоимости операций ввода-вывода, которые необходимо будет выполнить, и количестве процессорного времени, необходимого для обработки данных. Стоимость операций ввода-вывода вычисляется из ожидаемого количества обращений к диску, которые потребуются для обработки данных. Стоимость процессорного времени основывается на количестве обработанных кортежей. Эта стоимость конвертируется в эквивалентную стоимости ввода-вывода с помощью весового коэффициента. Весовой коэффициент является корректирующим значением стоимости про-цессорного времени, потому что обработка записи (стоимость процессора) относительно де-шевле, чем операция обращения к диску (стоимость ввода-вывода). Весовой коэффициент жестко задан в программном коде и не может быть изменен. Используемая формула полностью выглядит следующим образом: стоимость = (стоимость ввода-вывода) + W * (стоимость процессора) где стоимость ввода-вывода = количество обращений к диску, а стоимость процессора = ко-личество обработанных кортежей. W = весовой коэффициент, преобразующий стоимость процессорного времени в относительные единицы стоимости ввода-вывода (в настоящее время W=0.03). --------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2008, 16:58 |
|
||
|
"Багофичное" поведение оптимизатора запросов.
|
|||
|---|---|---|---|
|
#18+
vasilisЕсли мне не изменяет память, то в старых (прошлого века :) материалах этот очень условный коэффициент равнялся 0,03 и был одинаковый для всех железяк. Возможно потом что то изменилось... W = weighting factor converting CPU cost to relative I/O cost 3/100 т.е. 15 лет назад 3 операции цпу были равны 100 дисковым операциям, а сечас наверно где-то 3/1000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2008, 17:00 |
|
||
|
|

start [/forum/topic.php?fid=44&fpage=36&tid=1608082]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
27ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 315ms |

| 0 / 0 |
