2017-01-09 2 views
2

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

Таблица 1:

N_ID S_NAME DEPT 
    1 NAME1 DEPT1 
    2 NAME2 DEPT2 
    3 NAME3 DEPT3 

Таблица 2:

N_ID S_CITY PHONE 
    1 CITY1 PHONE1 
    2 CITY2 PHONE2 
    3 CITY3 PHONE3 

Я создал индекс, как показано ниже:

CREATE NONCLUSTERED INDEX IX_NC ON TBL1(N_ID) 
INCLUDE (S_NAME) 

CREATE NONCLUSTERED INDEX IX_NC ON TBL2(N_ID) 

Запрос:

SELECT A.N_ID,S_NAME FROM TBL1 A 
INNER JOIN TBL2 B ON A.N_ID=B.N_ID; 

Вот мой план выполнения:

enter image description here

+2

Почему вы хотите заменить вложенную петлю с объединением присоединения? Пусть SQL Server решит, какая операция соединения лучше всего подходит для ваших данных. –

+0

Если у меня много данных в tb2 или tb1., То оценочное количество выполнения, увеличивающееся, зависит от того, сколько данных имеет tb1 или tb2. –

+0

Убедитесь, что индексы не фрагментированы, статистика обновлена, и запросы должны выполняться просто отлично. –

ответ

2

Если у вас есть причины принуждая слияния присоединиться к более вложенных циклов, я бы не рекомендовал делать это ..

SQLServer внутренне реализует присоединяется в качестве трех операторов

1.Nested петли
2.Hash
3.Merge

EAC h имеет свои преимущества и не может сказать, что одно соединение лучше, чем другое. SQL может выбрать любое соединение, основанное на многих факторах, и в целом он выбирает план с меньшими затратами ...

Приходит к вашему вопросу , в соответствии с Документах ..

вложенных циклов будет выбран, когда ..

Если один вход присоединиться к небольшой (менее 10 строк), а другой вход присоединиться к довольно большой и индексированных по его присоединиться столбцы, объединение вложенных циклов с индексом - это самая быстрая операция соединения, поскольку они требуют наименьшего ввода-вывода и наименьших сравнений.

Также MSDN объясняет случаи, когда вложенный цикл является эффективным ..

A вложенных циклов является особенно эффективным, если внешним вход мал и внутренний вход preindexed и большим. Во многих небольших транзакциях, таких как те, которые влияют только на небольшой набор строк, объединение вложенных циклов индексов превосходит как объединения слияния, так и объединения хэшей.

Так что, если вы не заставляете намек и инженер данные таким образом, SQL выбирает слияние join..Merge присоединиться не представляется возможным в вашем случае

Ссылки:
https://msdn.microsoft.com/en-us/library/ms191426(v=sql.100).aspx

+0

Вам необязательно принудительно вводить подсказку. Так как тип используемого оператора определяется Оценщиком мощности, то переписывая запрос таким образом, чтобы «подделывать» более высокий счетчик строк, может заставить Оптимизатор использовать более подходящий оператор. [Взгляните на рассказы о судьбе Адама Мачанича] (https://www.youtube.com/watch?v=O8BGYC8_qEI). –

Смежные вопросы