it-swarm-eu.dev

Základy provádění plánu - Hash Match Confusion

Začínám se učit provádění plánů a jsem zmaten tím, jak přesně funguje hash zápas a proč by měl být použit v jednoduchém spojení:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

enter image description here

Jak to chápu, výsledky skenování Top indexu se stávají schopnými hash a každý řádek ve spodním indexovém skenování indexu je vyhledán. Chápu, jak hashovací tabulky fungují alespoň do určité míry, ale jsem zmaten tím, jaké hodnoty přesně dostanou hashed v příkladu jako je tento.

Co by mi dávalo smysl, je společné pole mezi nimi, id, hashed - ale pokud je tomu tak, proč hash number?

41
Kyle Brandt

Jako citace odpovědi SQLRockstar

nejlepší pro velké netříděné vstupy.

Nyní,

  • ze skenování indexu Users.DisplayName (předpokládá se bez klastru) získáte Users.Id (za předpokladu, že je seskupeno) = netříděno
  • Také kontrolujete příspěvky pro OwnerUserId = netříděné

Jedná se o 2 neuspořádané vstupy.

Uvažoval bych o indexu v tabulce Příspěvky na OwnerUserId, včetně názvu. Tímto způsobem přidáte do JOIN + nějaké pořadí na jedné straně vstupu a bude pokrývat index

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Možná zjistíte, že index Users.DisplayName nebude použit a místo toho prohledá PK.

31
gbn

Od http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

„Spojení hashů je jednou z dražších operací spojování, protože k vytvoření spojení je nutné vytvořit tabulku hash. To znamená, že je to spojení, které je nejlepší pro velké, netříděné vstupy. spojů

Spojení hash nejprve přečte jeden ze vstupů a hashe sloupec join a vloží výsledné hodnoty hash a sloupce do tabulky hash vytvořené v paměti. Pak přečte všechny řádky v druhém vstupu, provede jejich hashování a zkontroluje řádky ve výsledném hashovacím bloku pro spojující řádky. "

které odkazují na tento příspěvek:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH

14
SQLRockstar

Výhodou hashování číselného pole je, že berete větší hodnotu a rozdělujete ji na menší kousky, aby se vešly do hashovací tabulky.

Grant Fritchey to popisuje takto:

„Hašovací tabulka je naproti tomu datová struktura, která rozděluje všechny prvky do stejně velkých kategorií nebo kbelíků, aby byl umožněn rychlý přístup k elementům. Funkce hashování určuje, do které kbelíky se prvek dostane. , můžete vzít řádek z tabulky, hash do hašovací hodnoty a pak hash uložit do hašovací tabulky. "

Můžete také získat bezplatnou kopii jeho ebooku „Rozdělení plánů provádění serveru SQL“ z odkazu v následujícím článku:

Zdroj: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

9
Jeff