Порядок предложений WHERE для SQL Server - PullRequest
2 голосов
/ 10 ноября 2009

Может ли иметь какое-либо значение оптимизация запросов, чтобы предложения WHERE были в другом порядке для SQL Server?

Например, будет ли план запроса для этого:

select * from table where col1 = @var1 and col2 = @var2

отличаться от этого?:

select * from table where col2 = @var2 and col1 = @var1

Конечно, это надуманный пример, и я попробовал более сложные. План запроса был одинаковым для обоих, но я всегда задавался вопросом, стоило ли заказывать предложения WHERE так, чтобы на первом месте были самые конкретные предложения, если оптимизатор каким-то образом «сокращает» результаты и может оказаться быстрее.

Это на самом деле просто мысленный эксперимент, я не собираюсь решать конкретную проблему с производительностью.

А как насчет других РСУБД?

Ответы [ 6 ]

5 голосов
/ 10 ноября 2009

Каждая современная СУБД имеет оптимизатор запросов, который, помимо прочего, отвечает за изменение порядка условий. Некоторые оптимизаторы используют для этого довольно сложную статистику, и они часто побеждают человеческую интуицию о том, что будет хорошим заказом, а что нет. Поэтому я могу предположить: если вы определенно можете сказать: «Этот порядок лучше, чем другой», то может оптимизатор, и он сам это выяснит.

Вывод: не беспокойтесь о таких вещах. Это редко стоит времени.

2 голосов
/ 10 ноября 2009

Читаемость для людей должна быть вашей единственной целью при определении порядка условий в предложении where. Например, если у вас есть объединение двух таблиц A и B, запишите все условия для A, а затем все условия для B.

1 голос
/ 10 ноября 2009

Нет, оптимизатор запросов в любом случае выяснит, какой индекс или статистику использовать. Я не совсем уверен, но я даже думаю, что логические выражения в SQL не оцениваются слева направо, но могут быть оценены в любом порядке с помощью оптимизатора запросов.

0 голосов
/ 10 ноября 2009

SQL является " декларативным ", поэтому это не имеет значения. Вы говорите СУБД, что вы хотите, она определяет наилучший способ (с учетом стоимости, времени и т. Д.).

В .net это будет иметь значение, потому что он процедурный и выполняется по порядку.

0 голосов
/ 10 ноября 2009

Кроме того, порядок может иметь значение в случае, если вы используете вложенные запросы. Чем меньше результирующий набор внутреннего запроса, тем меньше нужно будет сканировать внешний запрос. Конечно, сказав это, я во-вторых, что rsp сказал в комментарии выше - индексы являются основным ключом в определении того, сколько времени займет запрос; если у нас есть индекс для столбца, SQL Server будет непосредственно выполнять поиск SEEK вместо сканирования значений и, следовательно, упорядочение будет считаться неактуальным

0 голосов
/ 10 ноября 2009

Я не думаю, что это будет иметь большое значение .. Что имеет значение во всех языках SQL - это порядок, в котором вы используете функции SQL.

Например: Когда вы делаете что-то вроде этого:

select title, date FROM sometable WHERE to_char(date, 'DD-MM-YYYY') > "01-01-1960"

будет идти медленнее, чем это:

select title, date FROM sometable WHERE date > to_char('DD-MM-YYYY', %USERVALUE%)

Это связано с тем, сколько раз функция должна быть оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...