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