|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
with s as (select id from ...) select id from s minus select id from s where f(id) <= 0; with s as (select id from ...) select id from s where f(id) > 0; 1-й запрос отрабатывает за 5 секунд, 2-й - за 7 минут хотя оптимизатор показывает цену 1-го запроса в 5 раз выше. Статистику по всем связанным таблицам обновил - ничего принципиально не изменилось. Что может быть не так с оптимизатором или с настройками базы? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 10:45 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
Нельзя сравнивать стоимость разных запросов. Сравнивать можно стоимости разных планов одного запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 12:20 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
Basil A. SidorovНельзя сравнивать стоимость разных запросов. Сравнивать можно стоимости разных планов одного запроса. тем не менее, вопрос, почему 1-ый запрос работает на 2 порядка быстрее, остается ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 12:56 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
Toshkin, Вы умеете получать план запроса с т. н. section actuals? Прикрепите такие планы для обоих запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 09:20 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
Basil A. SidorovНельзя сравнивать стоимость разных запросов. Сравнивать можно стоимости разных планов одного запроса. А, собственно, почему? По моему пониманию, ибм-овский таймерон = 1/1000 секунды, а секунды можно сравнивать между собой. Другое дело, что *верить* этим цифрам нельзя, что для разных планов одного запроса, что для нескольких. Даже если параметры tablespace и cpuspeed выставлены "правильно" и вся статистика собрана. Просто такой вот трудный и тяжёлый предмет, основанный на предположениях, которые часто не выполняются в реальности. Для начала, надо иметь представление, что означают планы и как оптимизатор считает стоимости (к сожалению, я не знаю ничего, кроме https://www.apress.com/gp/book/9781590596364 - Cost-Based Oracle Fundamentals. Lewis, Jonathan), а потом.... ну... в запросе из двух таблиц как-то можно разобраться и понять, а больше - дела становятся резко хуже... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 14:06 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
Toshkinwith s as (select id from ...) select id from s minus select id from s where f(id) <= 0; with s as (select id from ...) select id from s where f(id) > 0; 1-й запрос отрабатывает за 5 секунд, 2-й - за 7 минут хотя оптимизатор показывает цену 1-го запроса в 5 раз выше. Статистику по всем связанным таблицам обновил - ничего принципиально не изменилось. Что может быть не так с оптимизатором или с настройками базы? Это означает, что оптимизатор (исходя из каких-то предположений) ошибается в оценке стоимости работ. Запросы (планы) напрямую тут, кстати, сравнивать нельзя. В общем случае они могут давать разные result set'ы. Но то, как удалось "обмануть" оптимизатор и заставить его отказаться от плохого плана, может быть ключём к пониманию "что было не так". Хотелось бы спросить: 1. Ф-я f(x) - детерминированная? (хотя оптимизатор может и не использовать эту информацию). 2. Ф-я f(x) - монотонная? Обычно это грубая ошибка (с точки зрения производительности) в предикате использовать функцию/выражение, включающие данные строки (какой-либо/каких-либо из колонок) и сравнивать с константой. Мало чего можно придумать хуже для сколько-нибудь больших таблиц и малых ожидаемых result set'ов. Какова селективность предиката "f(id) > 0" ? Если у Вас нету индекса по выражению, самой DB2 взять эту информацию не от куда, сколько Вы статистику ни обновляйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 14:58 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
Нет, ну, "по здравому смыслу" кажется, что и -- minus select id from s where f(id) <= 0; и select id from s where f(id) > 0 должен быть фуллскан и второй запрос был бы быстрее... если s была бы таблицей. Когда же s as (select id from ...), произошло какое-то переписывание запроса во что-то. А в (select id from ...) может быть чёрт знает что. И с функцией f далеко не всё ясно - если она на SQL/PL, возможна подстановка с возможными последствиями. И неизвестно, насколько адекватны PAGESIZE, EXTENTSIZE, PREFETCHSIZE, OVERHEAD!!!, TRANSFERRATE!!! https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000929.html ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 16:03 |
|
оптимизатор запросов на 11.1
|
|||
---|---|---|---|
#18+
[quot CawaSPb]Toshkinwith s as (select id from ...) Хотелось бы спросить: 1. Ф-я f(x) - детерминированная? (хотя оптимизатор может и не использовать эту информацию). 2. Ф-я f(x) - монотонная? Обычно это грубая ошибка (с точки зрения производительности) в предикате использовать функцию/выражение, включающие данные строки (какой-либо/каких-либо из колонок) и сравнивать с константой. Мало чего можно придумать хуже для сколько-нибудь больших таблиц и малых ожидаемых result set'ов. Какова селективность предиката "f(id) > 0" ? Если у Вас нету индекса по выражению, самой DB2 взять эту информацию не от куда, сколько Вы статистику ни обновляйте. f(x) - deterministic модульная, возвращает статус smallint от 0 до 4 и состоит из нескольких простых запросов по индексам. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2019, 16:50 |
|
|
start [/forum/topic.php?fid=43&msg=39801653&tid=1600260]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 165ms |
0 / 0 |