Семь внутренних объединений в запросе слишком много?

StackOverflow https://stackoverflow.com/questions/254546

  •  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 соединений, а не глубина.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top