Скажем, у меня есть вопрос:Изменение SQL-запрос, чтобы точно контролировать последовательность выполнения
SELECT * FROM tb1
WHERE col1 = 1
AND col2 = 2
Предположим col1
более избирательна, и двигатель будет нормально выполнять col1 = 1
, во-первых, чтобы получить более высокую производительность. Если условия усложняются, двигатель может легко принять неправильное решение. Поэтому я хочу явно контролировать последовательность выполнения, как я могу это сделать?
Я думаю, один способ может работать. Во-первых, запрос
SELECT * FROM tb1
WHERE col1 = 1
выберите результат в временную таблицу, а затем фильтровать по col2 = 2
, но поскольку условия становятся все более и более, конечно, это невозможно создать так много временную таблицу. Есть идеи?
Update 1
Люди говорят, что оптимизатор всегда делает правильный выбор, на котором фильтр должен быть выполнен, во-первых, чтобы получить более высокую производительность, но я до сих пор подозреваю, что он может работать на 100% времени, как запрос становится все больше и больше сложно.
Другой вопрос: могу ли я изменить порядок выполнения подзапросом или CTE? как:
SELECT * FROM
(
SELECT * FROM tb1 WHERE col1 = 1
)t
WHERE col2 = 2
Я не думаю, что порядок выполнения двух условий «И» находится под вашим контролем в SQL Server. –
'двигатель может легко принять неправильное решение' ... что это значит? –
Я бы не пытался перехитрить сотни тысяч человеко-часов, потраченных на оптимизатор запросов SQL Server, пока вы не увидите реальную проблему. – hatchet