Эффективность T / SQL и порядок исполнения - PullRequest
6 голосов
/ 09 апреля 2010

Что касается порядка выполнения операторов в SQL, есть ли разница между следующими показателями производительности?

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

И

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

Если есть какая-либо разница, возможно, у вас есть ссылка и т. Д., Где можно узнать больше об этом?

Спасибо за тонну,

Кайл

Ответы [ 7 ]

4 голосов
/ 09 апреля 2010

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

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

2 голосов
/ 09 апреля 2010

Там не будет никакой разницы. Вы можете вытащить запрос в SQL Server и щелкнуть значок Показать примерный план выполнения и проверить план выполнения для двух запросов. Они должны быть идентичны.

1 голос
/ 09 апреля 2010

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

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

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

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

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

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

1 голос
/ 09 апреля 2010

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

Имеет ли значение критерий условие WHERE?

0 голосов
/ 10 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

...