2016-09-15 8 views
0

Скажем, у меня есть вопрос:Изменение 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 
+0

Я не думаю, что порядок выполнения двух условий «И» находится под вашим контролем в SQL Server. –

+0

'двигатель может легко принять неправильное решение' ... что это значит? –

+2

Я бы не пытался перехитрить сотни тысяч человеко-часов, потраченных на оптимизатор запросов SQL Server, пока вы не увидите реальную проблему. – hatchet

ответ

0

Обычно SQL Optimizer может найти лучший план, но если вы хотите, чтобы исправить это, есть варианты ...

Вы можете создать тестовый набор данных, для которого SQL двигатель выбирает правильный (желаемый) план, вы можете извлечь план запроса в строку XML (см. SET SHOWPLAN_XML ON ) и, наконец, использовать опцию WITH PLAN (подсказку подсказки), чтобы исправить план.

Помните, что запрос будет сбой, если вы измените схему в будущем без обновления плана.

0

Для этого вы должны использовать подсказки для запросов.

  1. Вы можете использовать подсказку запроса USE PLAN.
  2. Используйте with(index(index_name)), созданный для определенного порядка строк.

Для первого момента вы должны получить XML-план, выполнив сначала свой запрос, в котором вы получаете желаемый порядок выполнения. И для второго, просто создайте индекс для тех столбцов, в которых вы разместили столбец в нужном порядке.