sql >> Databáze >  >> RDS >> Sqlserver

volba operátora optimalizace dotazů – vnořené smyčky vs hash match (nebo sloučení)

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).



  1. Převeďte řádky na sloupce Oracle SQL

  2. MYSQL nepřidává informace do mé databáze

  3. Výběr podmnožiny řádků, které přesahují procento celkových hodnot

  4. Jak provést CONTAINS() ve dvou sloupcích fulltextového indexového vyhledávání SQL