Семь внутренних объединений в запросе слишком много?
-
05-07-2019 - |
Вопрос
У меня есть запрос, который имеет 7 внутренних объединений (поскольку большая часть информации распределена в других таблицах), несколько коллег были удивлены. Мне было интересно, должны ли они удивляться или у них нормально 7 внутренних соединений?
Решение
это не неслыханно, но я хотел бы представить его для удобства использования и обслуживания
Другие советы
Два вопроса:
<Ол>Если так, то семь - это хорошо. Если вы не можете объяснить запрос, то семь - это слишком много.
Это нормально, если ваша схема находится в 5-й нормальной форме :)
В зависимости от того, что вы пытаетесь выполнить, большое количество объединений в запросе не замечательно.
Лично меня бы меньше интересовало количество объединений, используемых для возврата желаемого набора результатов, и больше меня интересовало, оптимизирован ли запрос и выполняется ли он в приемлемых параметрах.
Если запрос полностью оптимизирован и не может быть сокращен, но сам запрос не выполняется достаточно быстро, то возможно, что структура структуры данных не соответствует тому, что вы пытаетесь сделать. В этот момент вы можете переоценить то, что вы пытаетесь достичь, или структуру данных, которые используются в вашей бизнес-модели.
Это совсем не необычно. В такой системе, как Siebel, число соединений обычно отображается в двойных числах.
Семь соединений затрудняют читабельность, но важнее производительность и масштабируемость. Если все в порядке, дерзайте.
Это, вероятно, не нормально, но, конечно, не чрезмерно. Если вы снова и снова присоединяетесь к одним и тем же таблицам, создайте несколько представлений.
количество объединений зависит от вашей модели данных, в запросе может быть 7 объединений, если это то, что вы запрашиваете - я помню, что у меня были похожие запросы в приложении, над которым я работал давно, производительность зависит от многих факторов (таблица размер, индексы, загрузка сервера, конфигурация сервера и многие другие), и я не думаю, что можно обобщить, что 7 объединений плохие. Р>
если это работает для вас, то я думаю, это нормально: D
Да, это нормально, но на самом деле это не очень хорошая идея с точки зрения производительности. Поскольку планы запросов основаны на оценочной стоимости, существует увеличение количества ошибок по мере увеличения числа соединений (или любого другого оператора в этом отношении):
Оптимизатор запросов SQL Server оценивает как минимум одну строку, выходящую из оператора поиска. Это сделано для того, чтобы избежать случая, когда выбирается очень дорогое поддерево из-за недооценки мощности. Если предполагается, что поддерево возвращает ноль строк, многие планы стоят примерно одинаково, и в результате могут быть ошибки при выборе плана. Таким образом, вы заметите, что оценка высока & # 8220; для этого случая и некоторые ошибки могут привести. Вы также можете заметить, что мы оцениваем 20 выполнений этой ветви вместо фактических 10. Однако, учитывая количество объединений, которые были оценены перед этим оператором, отключение с коэффициентом 2 (10 строк) не считается быть слишком плохим. ( Ошибки могут увеличиваться в геометрической прогрессии с увеличением числа соединений ).
Кроме того, оптимизатор пытается сбалансировать время, необходимое для разработки плана, и потенциальную экономию - он не будет тратить весь день на поиск наиболее оптимального плана. Чем больше объединений, тем больше существует альтернативных планов - некоторые из которых могут быть более оптимальными, чем оптимизатор успевает найти.
7 или даже больше не является чем-то необычным в хранилищах данных, где таблица фактов может легко иметь внешние ключи для десятков измерений. В сценарии хранилища данных количество элементов измерений обычно меньше по сравнению с таблицей фактов, поэтому фильтры по измерениям помогают использовать таблицу фактов при поиске или сканировании индекса.
Для нормализованной транзакционной схемы обычно не проблема, если количество элементов в наборе результатов низкое в первичной базовой таблице (т. е. выбрать все об одном клиенте), поскольку внешние ключи обычно могут просто приводить к поиску индекса или сканирование индекса.
7 хорошо, если ваша база данных требует этого. Однако, если 7 необходим для достижения вашей цели, я бы пересмотрел проект базы данных, чтобы убедиться, что этот уровень неизвестности действительно необходим.
Из любопытства, это DB2? Просто шаблон, который я заметил:)
это 7 внутренних объединений в одной таблице, 7 внутренних объединений в разных таблицах или 7 вложенных внутренних объединений?
... вопрос с подвохом! Это действительно не имеет значения, если это то, что требуется вашей структуре базы данных, тогда это правильно
предостережение: если это 7 вложенных внутренних объединений в одной таблице, возможно, у вас плохо структурированная таблица; -)
Это конечно не необычно. Однако, по крайней мере в Oracle, 7 - это специальное число, так как более того, и оптимизатор больше не может проверять каждый порядок соединения (из-за факторного роста числа возможностей). Поэтому было бы разумно избегать перехода на 7, если вы не готовы присматривать за своим планом выполнения.
Я думаю, что вам нужно избегать глубины соединения более 7. 7 внутренних объединений глубиной менее 7 соединений, конечно, не неслыханны, но иногда люди слышат " 7 объединений " и думаю, что нет-нет, это 7 соединений, а не глубина.