АБСОЛЮТНО. Хеш съвпадението би било огромно подобрение. Създаването на хеша на по-малката таблица с 19 223 реда и след това проучването му с по-голямата таблица с 65 991 реда е много по-малка операция от вложения цикъл, изискващ 1 268 544 993 сравнения на редове.
Единствената причина сървърът да избере вложените цикли е, че е подценил силно броя на включените редове. Вашите таблици имат ли статистика за тях и ако да, актуализират ли се редовно? Статистиката е това, което позволява на сървъра да избира добри планове за изпълнение.
Ако правилно сте адресирали статистиката и все още имате проблем, можете да го принудите да използва HASH присъединяване по следния начин:
SELECT *
FROM
TableA A -- The smaller table
LEFT HASH JOIN TableB B -- the larger table
Моля, обърнете внимание, че в момента, в който направите това, ще се задейства и редът за присъединяване. Това означава, че трябва да подредите всичките си таблици правилно, така че техният ред на свързване да има смисъл. Обикновено бихте проучили плана за изпълнение, който сървърът вече има, и промените реда на вашите таблици в заявката, за да съответства. Ако не сте запознати с това как да направите това, основното е, че всеки „ляв“ вход е първи, а в графичните планове за изпълнение левият вход е долният един. Сложно обединяване, включващо много таблици, може да трябва да групира обединенията заедно в скоби или да използва RIGHT JOIN
за да получите оптимален план за изпълнение (разменете левия и десния вход, но въведете таблицата в правилната точка в реда на свързване).
Като цяло е най-добре да избягвате използването на съвети за присъединяване и принудителното присъединяване към реда, така че първо направете каквото можете! Можете да разгледате индексите на таблиците, фрагментацията, намаляването на размерите на колоните (като използване на varchar
вместо nvarchar
където Unicode не се изисква), или разделяне на заявката на части (първо вмъкнете във временна таблица, след което се присъединете към нея).