Выберите оценочный ордер "where clause"
В Sql Server 2005, когда у меня есть несколько параметров, у меня есть гарантия того, что порядок оценки будет всегда слева направо?
Используя пример:
select a from table where c=1 and d=2
В этом запросе, если условие "c = 1" не выполняется, условие "d = 2" никогда не будет оценено?
PS- "c" - целочисленный индексированный столбец, d - большой varchar и не индексируемый столбец, требующий полного сканирования таблицы
update Я пытался избежать выполнения двух запросов или условных операторов, мне просто нужно что-то вроде: если условие "c" не позволяет избежать выполнения тяжелого условия "d", поскольку он не требуется в моем случае.
Ответы
Ответ 1
Нет гарантий для порядка оценки. Оптимизатор попытается найти наиболее эффективный способ выполнения запроса, используя имеющуюся информацию.
В вашем случае, поскольку c индексируется и d не является, оптимизатор должен заглянуть в индекс, чтобы найти все строки, которые соответствуют предикату на c, а затем извлечь эти строки из данных таблицы, чтобы оценить предикат на d.
Однако, если он определяет, что индекс на c не очень избирателен (хотя не в вашем примере, гендерный столбец редко полезно индексируется), он может решить сделать сканирование таблицы в любом случае.
Чтобы определить порядок выполнения, вы должны получить план объяснения для своего запроса. Однако, поймите, что этот план может измениться в зависимости от того, что оптимизатор считает лучшим сейчас.
Ответ 2
SQL Server создаст оптимизированный план для каждого выполняемого оператора. Вам не нужно заказывать свое предложение where, чтобы получить эту выгоду. Единственное, что у вас есть, это то, что он будет запускать инструкции, чтобы:
SELECT A FROM B WHERE C
SELECT D FROM E WHERE F
будет запускать первую строку перед второй.
Ответ 3
Вы можете посмотреть план выполнения запроса и определить, что он на самом деле пытается сделать. Я думаю, что механизм запросов SQL Server должен выполнять этот тип сканирования и разумно перевести его в операции. Например, если вы делаете "дорогостоящий и ложный", он быстро оценивает значение false.
Из того, что я узнал, то, что вы набираете, (и может быть) отличается от того, что фактически выполняется. Вы просто говорите серверу о том, какие результаты вы ожидаете. Как он получает ответ, не коррелирует слева направо от кода, который вы предоставляете.
Ответ 4
Если вы хотите убедиться, что вы можете проверить "План выполнения запросов" . План выполнения, который MSSQL создает/оптимизирует, достаточно умен, чтобы проверять индексированный столбец перед столбцом varchar.
Ответ 5
Один из способов управления порядком оценки - это выражение CASE.
[изменить]
Популярное мнение, которое я пытался выразить, было:
Вы не можете зависеть от порядка оценки выражения для таких вещей, как "ГДЕ ИЛИ", поскольку оптимизатор может выбрать план который оценивает второй предикат до первого. Но порядок оценки выражений в операторе CASE фиксирован, поэтому вы можете зависеть от детерминированной оценки короткого замыкания CASE утверждение.
Это немного усложняется, как описано на сайте ниже:
http://blogs.msdn.com/b/bartd/archive/2011/03/03/don-t-depend-on-expression-short-circuiting-in-t-sql-not-even-with-case.aspx
Ответ 6
Оптимизатор запросов MS SQL Server делает короткое замыкание, да. Гарантированный.
Запустите это:
select 1 where 1 = 0 and 1 / 0 = 10
Он будет работать нормально и не будет ошибкой, даже если вы делите на ноль, потому что оптимизатор запросов будет короткозамкнуто оценивать предложение where. Это имеет значение для любого предложения where, где вы "и", и одна из частей и является константой.
Ответ 7
Короткое замыкание выполняется, когда условие, на которое мы ссылаемся, включает только литералы или константы. Так, например, скажем, у нас есть таблица TableA, которая имеет номер столбца со всеми положительными номерами от 1 до 10, а затем, если я напишу этот запрос.
Выберите num из таблицыA WHERE TableA.num < 0 И 1/0 = 10.
Это приведет к ошибке.
Является ли компилятор достаточно умным, чтобы определить, что мое второе предложение состоит из констант, поэтому он должен оценить это, прежде чем оценивать предложение, которое требует какого-либо сканирования из таблицы или индекса?