2014-11-27 2 views
1

У меня есть 2 таблицы,Есть ли шанс вручную изменить план выполнения?

  1. нужно
  2. NeedCategory

Нужна таблица имеет clusted индекса на needid колонки, и NeedCategory имеет композитный кластерный индекс needid и CategoryID.

Теперь взгляните на следующий запрос и план выполнения запроса.

SELECT N.NeedId,N.NeedName,N.ProviderName  
    FROM dbo.Need N  
    JOIN dbo.NeedCategory NC  
    ON nc.NeedId = n.NeedId  
    WHERE IsActive=1  
    AND CategoryId= 2 
    ORDER BY NeedName 

Execution plan

  • Кластерный индекс сканирования на необходимость таблицы происходит по IsActive = 1.

  • Кластерный индекс сканирования на needcategory таблицы происходит по CategoryId = 2

Мой вопрос:

  1. Почему сканирование происходит до соединения? если это произойдет после присоединения, тогда фильтр будет легче. Даже если оптимизатор выбирает сначала выполнение сканирования.
  2. Есть ли возможность изменить порядок выполнения вручную? не

Заранее спасибо

ответ

1

Нет это не было бы легче после того, как присоединиться.

Почему вы думаете, что после присоединения будет легче?

Почему вы думаете, что лучше совместить все nc.NeedId = n.NeedId, а затем фильтровать?
Если вы сначала фильтруете, вам никогда не придется сопоставлять nc.NeedId = n.NeedId, которые все равно будут устранены.

Это относительно дешевый Merge Join - это хорошо.

Допустим, я сравниваю носки с ботинками и хочу только красные носки. Зачем мне сопоставлять синий носок с ботинками, а затем устранить его.

0
  1. Допустим, что ваш Need таблица имеет 10000 строк, половина из которых имеет IsActive = 1; NeedCategory имеет 100 рядов, а 80 - CategoryID = 2. Будет ли быстрее подключаться к 10000 строк до 100 строк, затем фильтровать результат или сканировать таблицы для фильтрации строк до того, как они присоединятся к операции, сопоставив 5000 строк до 80 строк?

  2. Вы можете повлиять на то, как план сгенерирован в пределах определенного предела. Однако будьте очень осторожны с этим. SQL Server часто знает данные лучше, чем разработчик.