Эффективность T/SQL и Порядок Выполнения

В отношении порядка выполнения операторов в SQL, там какое-либо различие между следующей мудрой производительностью?

SELECT * FROM Persons
WHERE UserType = 'Manager' AND LastName IN ('Hansen','Pettersen')

И:

SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen') AND UserType = 'Manager'

Если существует какое-либо различие, есть ли, возможно, ссылка и т.д., что Вы можете иметь, где можно узнать больше об этом?

Благодарит тонну,

Kyle

6
задан Dustin Laine 8 June 2011 в 16:56
поделиться

7 ответов

Оптимизатор, поскольку он использует оптимизатор на основе стоимости, решит, какой "маршрут" лучше всего: он будет оценивать варианты на основе статистики, а затем перейдет от там. Порядок терминов не должен иметь значения (хотя то, как вы вкладываете вещи, может иметь значение).

РЕДАКТИРОВАТЬ: В Oracle до недавнего времени был оптимизатор на основе правил (RBO), но теперь этот был выведен из употребления . Поскольку RBO не работал со статистикой, можно было увидеть различия в планах запросов в зависимости от порядка предикатов.

4
ответ дан 16 December 2019 в 21:37
поделиться

Никакой разницы. Оба результата приведут к одному и тому же плану выполнения.

0
ответ дан 16 December 2019 в 21:37
поделиться

Я добавлю следующую ссылку .

План запроса выбирается на основе статистики по таблице и задействованным индексам (с учетом операций, которые необходимо выполнить). Является ли выбранный план выполнения запроса лучшим, зависит от множества факторов, но ответ на ваш вопрос заключается в том, что MS SQL будет производить один и тот же план независимо (он будет рассматривать лучший порядок для всех трех условий и найдет тот же результат в конце ).

Однако следует отметить, что планировщики несовершенны и они оценивают только стоимость, поэтому в некоторых случаях (при условии, что вы знаете, каковы ограничения вашего планировщика запросов в деталях), вы можете переписать условия запроса, чтобы помочь планировщик видит лучший путь.

Это (если даже возможно) следует делать только для тех запросов, которые доказали свою важность, а также обратите внимание, что такая оптимизация может замедлить работу при изменении статистики данных.

Кроме того, в большинстве случаев есть более эффективные способы (изменение индексов) для оптимизации запросов, и это следует оставить на усмотрение планировщика запросов.

Одним из основных пунктов СУБД было , а не , чтобы указать, как извлекать данные (декларативный характер запросов) - и в большинстве случаев современные планировщики запросов найдут для вас хороший план.

1
ответ дан 16 December 2019 в 21:37
поделиться

Во всех основных базах данных sql, нет никакой разницы .

0
ответ дан 16 December 2019 в 21:37
поделиться

Разницы не будет. Вы можете поднять запрос в SQL Server и щелкнуть на значке Display Estimated Execution Plan и проверить план выполнения для двух запросов. Они должны быть идентичны.

2
ответ дан 16 December 2019 в 21:37
поделиться

В SQL Server 2000 есть разница. У меня было много головной боли с этим. По-видимому, он оценивает пункты where в том порядке, в котором они определены. Чтобы указать, хочу ли я фильтровать данные через индекс, мне пришлось добавить предложение WITH (INDEX (MY_INDEX_NAME1, MY_INDEX_NAME2)) после оператора FROM.

0
ответ дан 16 December 2019 в 21:37
поделиться

Оптимизатор волен переставлять и выполнять предикаты так, как он считает наиболее эффективным/затратным для получения данных.

Имеет ли значение порядок критериев в предложении WHERE?

1
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: