В отношении порядка выполнения операторов в SQL, там какое-либо различие между следующей мудрой производительностью?
SELECT * FROM Persons
WHERE UserType = 'Manager' AND LastName IN ('Hansen','Pettersen')
И:
SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen') AND UserType = 'Manager'
Если существует какое-либо различие, есть ли, возможно, ссылка и т.д., что Вы можете иметь, где можно узнать больше об этом?
Благодарит тонну,
Kyle
Оптимизатор, поскольку он использует оптимизатор на основе стоимости, решит, какой "маршрут" лучше всего: он будет оценивать варианты на основе статистики, а затем перейдет от там. Порядок терминов не должен иметь значения (хотя то, как вы вкладываете вещи, может иметь значение).
РЕДАКТИРОВАТЬ: В Oracle до недавнего времени был оптимизатор на основе правил (RBO), но теперь этот был выведен из употребления . Поскольку RBO не работал со статистикой, можно было увидеть различия в планах запросов в зависимости от порядка предикатов.
Никакой разницы. Оба результата приведут к одному и тому же плану выполнения.
Я добавлю следующую ссылку .
План запроса выбирается на основе статистики по таблице и задействованным индексам (с учетом операций, которые необходимо выполнить). Является ли выбранный план выполнения запроса лучшим, зависит от множества факторов, но ответ на ваш вопрос заключается в том, что MS SQL будет производить один и тот же план независимо (он будет рассматривать лучший порядок для всех трех условий и найдет тот же результат в конце ).
Однако следует отметить, что планировщики несовершенны и они оценивают только стоимость, поэтому в некоторых случаях (при условии, что вы знаете, каковы ограничения вашего планировщика запросов в деталях), вы можете переписать условия запроса, чтобы помочь планировщик видит лучший путь.
Это (если даже возможно) следует делать только для тех запросов, которые доказали свою важность, а также обратите внимание, что такая оптимизация может замедлить работу при изменении статистики данных.
Кроме того, в большинстве случаев есть более эффективные способы (изменение индексов) для оптимизации запросов, и это следует оставить на усмотрение планировщика запросов.
Одним из основных пунктов СУБД было , а не , чтобы указать, как извлекать данные (декларативный характер запросов) - и в большинстве случаев современные планировщики запросов найдут для вас хороший план.
Во всех основных базах данных sql, нет никакой разницы .
Разницы не будет. Вы можете поднять запрос в SQL Server и щелкнуть на значке Display Estimated Execution Plan и проверить план выполнения для двух запросов. Они должны быть идентичны.
В SQL Server 2000 есть разница. У меня было много головной боли с этим. По-видимому, он оценивает пункты where в том порядке, в котором они определены. Чтобы указать, хочу ли я фильтровать данные через индекс, мне пришлось добавить предложение WITH (INDEX (MY_INDEX_NAME1, MY_INDEX_NAME2)) после оператора FROM.
Оптимизатор волен переставлять и выполнять предикаты так, как он считает наиболее эффективным/затратным для получения данных.