Podstawy planu wykonania - zamieszanie przy dopasowaniu mieszania

39

Zaczynam się uczyć planów wykonania i jestem zdezorientowany, jak dokładnie działa dopasowanie mieszające i dlaczego miałoby być użyte w prostym złączeniu:

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

wprowadź opis zdjęcia tutaj

Jak rozumiem, wyniki skanowania indeksu górnego stają się skrótem i każdy wiersz w dolnym skrypcie klastrowym indeksu jest sprawdzany. Rozumiem, w jaki sposób tabele skrótów działają przynajmniej w pewnym stopniu, ale nie jestem pewien, które wartości dokładnie zostały zakodowane w takim przykładzie.

Co miałoby dla mnie sens to wspólne pole między nimi, identyfikator, jest mieszane - ale jeśli tak jest, to dlaczego haszować liczbę?

Kyle Brandt
źródło

Odpowiedzi:

29

Jak podaje odpowiedź SQLRockstar

najlepszy do dużych, nieposortowanych danych wejściowych.

Teraz,

  • ze skanu indeksu Users.DisplayName (zakładany nieklastrowany) otrzymujesz Users.Id (zakładając klastrowany) = nieposortowany
  • Skanujesz również posty w poszukiwaniu OwnerUserId = nieposortowane

To są 2 nieuporządkowane wejścia.

Zastanowiłbym się nad indeksem w tabeli Postów na OwnerUserId, w tym Tytuł. Spowoduje to dodanie porządku po jednej stronie danych wejściowych do JOIN + będzie obejmował indeks

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

Może się wtedy okazać, że indeks Users.DisplayName nie będzie używany i zamiast tego skanuje PK.

gbn
źródło
1
Okay, rozumiem teraz, myślałem o użytkownikach. Nazwa wyświetlacza została zamówiona przez PK, co po prostu nie jest prawdą. Teraz użycie Hash ma dla mnie o wiele większy sens. Dzięki!
Kyle Brandt
1
Możesz także spróbować OPTION (FAST n)podpowiedzi, gdzie n jest przybliżoną liczbą wierszy, której się spodziewasz. Spowoduje to odchylenie optymalizatora w kierunku zagnieżdżonych pętli zamiast łączenia skrótów, gdy n jest niskie. Powodem jest to, że złączenia mieszające są szybkie dla dużych złączeń, ale mają wysokie koszty uruchomienia. Pętle zagnieżdżone są drogie za wiersz, ale można zacząć bardzo tanio. Jest to więc kwestia dostrajania w oparciu o rzeczywiste dane i wzorzec dostępu.
Gajusz
1
@ Gaius: Osobiście wolałbym mieć indeksy niż wskazówki. Podpowiedź jest przydatna tylko dla zapytania po jego dodaniu. Z czasem podpowiedź staje się zobowiązaniem. Indeksy są zwykle przydatne znacznie dłużej.
gbn
1
to nie jest ani ani propozycja :-)
Gajusz
14

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

„Łączenie mieszające jest jedną z droższych operacji łączenia, ponieważ wymaga utworzenia tabeli skrótów, aby wykonać łączenie. To powiedziawszy, to połączenie jest najlepsze dla dużych, nieposortowanych danych wejściowych. z dołączeń

Łączenie mieszające najpierw odczytuje jedno z danych wejściowych i haszuje kolumnę łączenia, a następnie umieszcza wynikowy skrót i wartości kolumny w tabeli skrótów wbudowanej w pamięć. Następnie odczytuje wszystkie wiersze na drugim wejściu, haszy je i sprawdza wiersze w wynikowym segmencie mieszania pod kątem łączenia wierszy. ”

który prowadzi do tego postu:

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

HTH

SQLRockstar
źródło
Więc jeśli są to tylko pola identyfikatora, to chyba nie rozumiem korzyści z mieszania pola identyfikatora?
Kyle Brandt
+1 za link do bloga Craiga Freedmana, jest więcej dostępnych artykułów: blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff
9

Zaletą mieszania pola numerycznego jest to, że bierzesz większą wartość i dzielisz ją na mniejsze części, aby zmieściła się w tabeli mieszania.

Oto jak opisuje to Grant Fritchey:

„Z drugiej strony tabela skrótów to struktura danych, która dzieli wszystkie elementy na kategorie o równej wielkości lub segmenty, aby umożliwić szybki dostęp do elementów. Funkcja skrótu określa, do którego segmentu trafia element. Na przykład , możesz pobrać wiersz z tabeli, mieszać go w wartość skrótu, a następnie przechowywać wartość skrótu w tabeli skrótów. ”

Możesz także uzyskać bezpłatną kopię jego ebooka „Analiza planów SQL Server” z linku z następującego artykułu:

Źródło: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

Jeff
źródło
Kolejna ciekawa seria artykułów o JOINS
Jeff
Pracuję po swojemu, ale analizuję plany wykonania programu SQL Server - to świetnie! Ale utknąłem trochę w tym punkcie :-P
Kyle Brandt