powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией JOIN SELECT MAX
7 сообщений из 7, страница 1 из 1
Проблема с оптимизацией JOIN SELECT MAX
    #39848123
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опубликовали у нас тут одну статью на хабре с проблемами в СУБД. Там много различных косяков СУБД, в том числе Oracle, но в одну из них что-то слабо верится. А именно в косяк с LEFT JOIN и SELECT MAX (случай то вроде примитивный и MS SQL с ним легко справляется):

Запрос :
Код: plsql
1.
2.
3.
4.
5.
SELECT MAX(cc.ls) 
        FROM Product pr
        LEFT JOIN (SELECT MAX(shipment) AS ls, s.product
            FROM shipmentDetail s
            GROUP BY s.product) cc ON cc.product=pr.id



План:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                    |       |       |       | 22222 (100)|          |
|   1 |  SORT AGGREGATE          |                    |     1 |    31 |       |            |          |
|   2 |   NESTED LOOPS SEMI      |                    | 50001 |  1513K|       | 22222   (2)| 00:00:01 |
|   3 |    VIEW                  |                    | 50536 |  1283K|       | 22219   (2)| 00:00:01 |
|   4 |     HASH GROUP BY        |                    | 50536 |   493K|   191M| 22219   (2)| 00:00:01 |
|   5 |      INDEX FAST FULL SCAN| SHIPMENTDETAIL_P_S |    10M|    95M|       |  7871   (1)| 00:00:01 |
|*  6 |    INDEX UNIQUE SCAN     | SYS_C007890        | 49472 |   241K|       |     0   (0)|          |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 
   6 - access("CC"."PRODUCT"="PR"."ID")



То есть почему-то вместо того чтобы пробежать по Product и выцепить одну запись из индекса по каждому товару, Oracle бежит по всему индексу.

Я вроде его тоже проверял, но явно люди, которые создавали базу, что-то не донастроили. Только вопрос что?

Ну и заодно остальные косяки может кто сможет прокомментировать?
...
Рейтинг: 0 / 0
Проблема с оптимизацией JOIN SELECT MAX
    #39848153
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieТо есть почему-то вместо того чтобы пробежать по Product и выцепить одну запись из индекса по каждому товару, Oracle бежит по всему индексу.Быстропробежать большой индекс и к результату джоинить малый индекс вполне логично, так как меньшая глубина малого индекса может дать меньше чтений. Но еще логичнее было бы читать индексы по разу и хэш-джоинить.
...
Рейтинг: 0 / 0
Проблема с оптимизацией JOIN SELECT MAX
    #39848180
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Nitro_JunkieТо есть почему-то вместо того чтобы пробежать по Product и выцепить одну запись из индекса по каждому товару, Oracle бежит по всему индексу.Быстропробежать большой индекс и к результату джоинить малый индекс вполне логично, так как меньшая глубина малого индекса может дать меньше чтений. Но еще логичнее было бы читать индексы по разу и хэш-джоинить.

Там просто есть пример, когда добавляется условие LIKE 'Product 86%' и Oracle все равно FIRST ROW не вставляет. Хотя читать только первую запись ВСЕГДА быстрее.

Ну и живой тест дает в 10 раз быстрее. Можно конечно еще наверное нагнать данных, но что-то мне подсказывает что план не изменится.
...
Рейтинг: 0 / 0
Проблема с оптимизацией JOIN SELECT MAX
    #39848229
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieТам просто есть пример, когда добавляется условие LIKE 'Product 86%' и Oracle все равно FIRST ROW не вставляет.
А почему он должен вставлять FIRST ROW, если ваш запрос хочет все записи?

Nitro_JunkieНу и живой тест дает в 10 раз быстрее.
Интересное обоснование =)

Nitro_JunkieМожно конечно еще наверное нагнать данных, но что-то мне подсказывает что план не изменится.
Чтобы понимать в чем различие технологий, нужно хорошо понимать их.
Так что ту статью должны были писать 3 человека, по одному на БД.
...
Рейтинг: 0 / 0
Проблема с оптимизацией JOIN SELECT MAX
    #39848256
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|А почему он должен вставлять FIRST ROW, если ваш запрос хочет все записи?
В том то и дело, что не хочет. Он максимум хочет, а для этого достаточно одной записи. Ну и MS SQL вставляет FIRST ROW. Или по вашему MSSQL на таком элементарном запросе другой результат дает?
AlexFF__|Интересное обоснование =)
Не абсолютное, но важное. Я понимаю в 3 раза ошибиться, но в 10.
...
Рейтинг: 0 / 0
Проблема с оптимизацией JOIN SELECT MAX
    #39848262
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieЯ понимаю в 3 раза ошибиться, но в 10.
Никто не совершенен.
Тем более робот.
Если Вам действительно интересно разобраться именно в этом вопросе, то снимаете с парсинга трассировку 10053 и пристально изучаете.
Там будут все варианты плана, которые рассмотрел оптимизатор и цифири, из которых сложилась стоимость того или иного варианта.
А также трансформации и примечания, почему тот или иной путь доступа не был рассмотрен, if any.
Разберетесь досконально - сможете понять, какая статистика куда сыграла или какая трансформация не позволила случиться желаемому сценарию.
Вообще же оптимизатор слишком сложная машина, чтобы по единичному эксперименту в отдельно взятом окружении на отдельно взятой версии и конкретном наборе патчей делать далеко идущие выводы.
...
Рейтинг: 0 / 0
Проблема с оптимизацией JOIN SELECT MAX
    #39848263
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел на Ваш профиль.
Суда по увиденному, цель данного топика - утащить народ пофлеймить за сравнение СУБД...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией JOIN SELECT MAX
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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