Comments 36
Конкретно по вашему предположению, возможно Oracle просто не использует все возможные комбинации и выбирает из скудного списка, который, по их мнению, покрывает большинство ситуаций.
P.S. SQL Server то же работает и с 20 и более JOIN, вопрос как. Не всегда это получается быстро. К тому же я написал в разделе P.S., что выбор способа соединения таблиц это всего лишь одна из множество задач оптимизатора запроса.
После чтения такой книги, очень странно слышать слова «негативные отзывы от специалиста с 10 лет работы».
Меня удивляет отношение человека, с опытом 10 лет.
В моём понимании, «планировщик запроса» — это такая данность, как восход Солнца. И довольно глупо ругать Солнце, что оно утром светит в окно и мешает спать. Самое простое — добавить к «окно на восток», хорошие светонепроницаемые шторы.
И кажется, профессионал должен не ругать Солнце, а сразу высказать, какие шторы, для каких случаев, и почему.
Кстати, отдельный вопрос — когда вообще нужно собирать результаты из 20-ти таблиц? Можно хотя0бы намекнуть на прикладную область, и что за данные такого рода запросом вытаскивали?
Что касается прикладной области, то в моём случае приложением организовано как 1С, из тучи «динамических» таблиц, с похожим названием, но проблема была даже не в этом. Проблема была в том, что генератор запросов на каждую галочку не добавлял параметров к уже существующим соединениям, а писал ещё 1 JOIN. То есть я мог наставить галочек и получить 10 JOIN с одной и той же таблицей и в каждом JOIN я делал ограничение по своему столбцу.
Сколько интриги и метафор о книге про оптимизатор, а где же название-то? Общественность интересуется.
У bormotov, то же можете поинтересоваться про книгу по Oracle, если необходимо.
Он, кстати, очень не любит выкручивать руки оптимизатору хинтами и убеждён, что во многом проблемы производительности решаются правильной архитектурой БД.
И документацию Oracle Database 12c Release 2 Performance однозначно стоит почитать.
P.S. для меня тоже было странно услышать о таком мнении специалиста 10+ об оптимизаторе Oracle…
Дж. Льюис, ORACLE: Основы стоимостной оптимизации.
На русском издавали, например «Питер», аккурат десять лет назад.
При «правильных» настройках планировщик Oracle разворачивает запрос её формирования более, чем в 1000 join из 50+ таблиц.
Возможно, группировки сильно ограничивают количество вариантов.
Я бы хотел рассмотреть почему же SQL Server так долго строит план запроса.
Давайте поговорим о порядке соединения таблиц подробнее
настраивают на то, что на примере запроса из начала статьи будет разобран алгоритм построения плана и дана общая теория по специфике работы планировщика MS SQL. А закончится статья тем, что автор победил проблему с учётом вышеописанных знаний. По итогу же имеем «Вот запрос, нагенерированный 1С на 20 таблиц с повторами. Он строится иногда долго. Почему? Много таблиц в соединении плохо, так как эн-факториал. Вывод — не делайте много таблиц и уважайте планировщик». Ну такому уровню статей не место на Хабре, простите.
Сегодня я не буду рассматривать варианты исправления ситуации, скажу только что в моём случае исправить генерацию запроса в приложении было невозможно.
В данном вопросе очень важно понять — возможное количество соединений таблиц растёт по экспоненте, а не линейно
И вынес в раздел «вывод»
Относитесь более аккуратно к количеству JOIN в запрос и не мешайте оптимизатору. Если у вас не получается добиться нужного результата в запросе, где много JOIN, разбейте его на несколько, более мелких запросов и вы удивитесь на сколько лучше может получиться результат.
Для других — что оптимизатор это более сложная часть SQL Server и что о нём надо как минимум задумываться
Возможно кто-то даже решит заняться изучением оптимизатора основательно. Если хоть 1 человек примет такое решение — статья написана не зря.
если не секрет что за приложение такое нарисовало?
конструкция с in() обычно отрабатывается как loop что не способствует производительности
ну и план запроса неплохо бы в студию
а вообще любой планировщик бессилен против кривых рук
"Запросы с JOIN выполняются долго" — это наверное такая мантра, я часто это слышал. Но это далеко не всегда так. Даже если джойнятся большие таблицы. Даже если в запросе используется много джойнов.
Проблемы как правило либо в отсутствии нужных индексов, либо в наличии таких препятствий как OR и IN в условиях запроса, либо попытка обработки слишком большого объема данных в запросе. Или если понятно, что запрос будет отдавать одинаковые данные как с LEFT JOIN так и с INNER JOIN, то последний вариант может оказаться радикально эффективнее. Да что тут говорить, у каждого запроса в каждой СУБД могут быть свои особенности и этих особенностей не мало.
В приведенном запросе оптимизатор может нормально зацепиться разве что за условия
AND "pr"."area" IN (700)
AND "pr"."deleted_by_user"=0
AND "pr"."temporary" = 0
Но скорее всего эти условия сильно не ограничивают выборку, поэтому индексы не работают и приходится делать полный перебор. Подробности можно увидеть в EXPLAIN.
Запрос ужасен, надо что-то делать с тем сильным интеллектом, который его сгенерил, иначе если еще будут добавляться таблици, данных в таблицах станет существенно больше — будет
И… что это за точки в тексте запроса:
"pr"."id" = "ufref3758_i16"."request"
Я немного отстал от жизни и мне требуется пояснить синтаксис.Чапаев: А чего вся квартира в тараканах?
Петька: А это я диссертацию пишу. О тараканах.
Чапаев: Ну, расскажи.
Петька: Берем таракана, ставим его на стол и кричим: Беги! И он бежит! Отрываем ему ноги и кричим: Беги! Но он не бежит. Делаем вывод: таракан без ног не слышит!
Почему много JOIN в запросе это плохо или не мешайте оптимизатору