|
Проблема с оптимизацией JOIN SELECT MAX
|
|||
---|---|---|---|
#18+
Опубликовали у нас тут одну статью на хабре с проблемами в СУБД. Там много различных косяков СУБД, в том числе Oracle, но в одну из них что-то слабо верится. А именно в косяк с LEFT JOIN и SELECT MAX (случай то вроде примитивный и MS SQL с ним легко справляется): Запрос : Код: plsql 1. 2. 3. 4. 5.
План: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
То есть почему-то вместо того чтобы пробежать по Product и выцепить одну запись из индекса по каждому товару, Oracle бежит по всему индексу. Я вроде его тоже проверял, но явно люди, которые создавали базу, что-то не донастроили. Только вопрос что? Ну и заодно остальные косяки может кто сможет прокомментировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 10:18 |
|
Проблема с оптимизацией JOIN SELECT MAX
|
|||
---|---|---|---|
#18+
Nitro_JunkieТо есть почему-то вместо того чтобы пробежать по Product и выцепить одну запись из индекса по каждому товару, Oracle бежит по всему индексу.Быстропробежать большой индекс и к результату джоинить малый индекс вполне логично, так как меньшая глубина малого индекса может дать меньше чтений. Но еще логичнее было бы читать индексы по разу и хэш-джоинить. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 10:58 |
|
Проблема с оптимизацией JOIN SELECT MAX
|
|||
---|---|---|---|
#18+
-2-Nitro_JunkieТо есть почему-то вместо того чтобы пробежать по Product и выцепить одну запись из индекса по каждому товару, Oracle бежит по всему индексу.Быстропробежать большой индекс и к результату джоинить малый индекс вполне логично, так как меньшая глубина малого индекса может дать меньше чтений. Но еще логичнее было бы читать индексы по разу и хэш-джоинить. Там просто есть пример, когда добавляется условие LIKE 'Product 86%' и Oracle все равно FIRST ROW не вставляет. Хотя читать только первую запись ВСЕГДА быстрее. Ну и живой тест дает в 10 раз быстрее. Можно конечно еще наверное нагнать данных, но что-то мне подсказывает что план не изменится. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 11:32 |
|
Проблема с оптимизацией JOIN SELECT MAX
|
|||
---|---|---|---|
#18+
Nitro_JunkieТам просто есть пример, когда добавляется условие LIKE 'Product 86%' и Oracle все равно FIRST ROW не вставляет. А почему он должен вставлять FIRST ROW, если ваш запрос хочет все записи? Nitro_JunkieНу и живой тест дает в 10 раз быстрее. Интересное обоснование =) Nitro_JunkieМожно конечно еще наверное нагнать данных, но что-то мне подсказывает что план не изменится. Чтобы понимать в чем различие технологий, нужно хорошо понимать их. Так что ту статью должны были писать 3 человека, по одному на БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 12:19 |
|
Проблема с оптимизацией JOIN SELECT MAX
|
|||
---|---|---|---|
#18+
AlexFF__|А почему он должен вставлять FIRST ROW, если ваш запрос хочет все записи? В том то и дело, что не хочет. Он максимум хочет, а для этого достаточно одной записи. Ну и MS SQL вставляет FIRST ROW. Или по вашему MSSQL на таком элементарном запросе другой результат дает? AlexFF__|Интересное обоснование =) Не абсолютное, но важное. Я понимаю в 3 раза ошибиться, но в 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 12:48 |
|
Проблема с оптимизацией JOIN SELECT MAX
|
|||
---|---|---|---|
#18+
Nitro_JunkieЯ понимаю в 3 раза ошибиться, но в 10. Никто не совершенен. Тем более робот. Если Вам действительно интересно разобраться именно в этом вопросе, то снимаете с парсинга трассировку 10053 и пристально изучаете. Там будут все варианты плана, которые рассмотрел оптимизатор и цифири, из которых сложилась стоимость того или иного варианта. А также трансформации и примечания, почему тот или иной путь доступа не был рассмотрен, if any. Разберетесь досконально - сможете понять, какая статистика куда сыграла или какая трансформация не позволила случиться желаемому сценарию. Вообще же оптимизатор слишком сложная машина, чтобы по единичному эксперименту в отдельно взятом окружении на отдельно взятой версии и конкретном наборе патчей делать далеко идущие выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2019, 12:55 |
|
|
start [/forum/topic.php?fid=52&msg=39848262&tid=1882205]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
94ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 439ms |
0 / 0 |