ABSOLUTNĚ. Hash match by byl obrovským zlepšením. Vytvoření hashe v menší tabulce s 19 223 řádky a následné prozkoumání pomocí větší tabulky s 65 991 řádky je mnohem menší operace než vnořená smyčka vyžadující 1 268 544 993 porovnání řádků.
Jediný důvod, proč by server zvolil vnořené smyčky, je ten, že silně podcenil počet zapojených řádků. Mají vaše tabulky statistiky, a pokud ano, jsou pravidelně aktualizovány? Statistiky umožňují serveru vybrat si dobré plány provádění.
Pokud jste správně vyřešili statistiky a stále máte problém, můžete jej přinutit použít HASH spojení takto:
SELECT *
FROM
TableA A -- The smaller table
LEFT HASH JOIN TableB B -- the larger table
Vezměte prosím na vědomí, že v okamžiku, kdy to uděláte, bude také vynucen příkaz připojení. To znamená, že musíte správně uspořádat všechny své stoly, aby jejich pořadí spojení dávalo smysl. Obecně byste prozkoumali plán provádění, který již server má, a změnili pořadí vašich tabulek v dotazu, aby odpovídalo. Pokud nevíte, jak to udělat, základní je, že každý „levý“ vstup je na prvním místě a v grafických prováděcích plánech je levý vstup dolní jeden. Složité spojení zahrnující mnoho tabulek může vyžadovat seskupení spojení v závorkách nebo použití RIGHT JOIN
aby byl plán provádění optimální (prohoďte levý a pravý vstup, ale uveďte tabulku do správného bodu v pořadí spojení).
Obecně je nejlepší vyhnout se používání rad pro spojení a vynucování pořadí spojení, takže nejprve udělejte cokoli jiného, co můžete! Můžete se podívat na indexy v tabulkách, fragmentaci, snížení velikosti sloupců (například pomocí varchar
místo nvarchar
kde není vyžadováno Unicode), nebo rozdělení dotazu na části (nejprve vložte do dočasné tabulky a poté se k ní připojte).