it-swarm.com.de

Hash Keys Probe und Residuum

Angenommen, wir haben eine Frage wie diese:

select a.*,b.*
from 
a join b
on a.col1=b.col1
and len(a.col1)=10

Unter der Annahme, dass die obige Abfrage einen Hash-Join verwendet und ein Residuum enthält, lautet der Testschlüssel col1 Und das Residuum len(a.col1)=10.

Aber während ich ein anderes Beispiel durchging, konnte ich sehen, dass sowohl die Sonde als auch der Rest dieselbe Spalte waren. Unten ist eine Ausarbeitung dessen, was ich zu sagen versuche:

Abfrage:

select *
from T1 join T2 on T1.a = T2.a 

Ausführungsplan mit hervorgehobener Sonde und Rest:

(enter image description here

Testdaten:

create table T1 (a int, b int, x char(200))
create table T2 (a int, b int, x char(200))

set nocount on
declare @i int
set @i = 0
while @i < 1000
  begin
      insert T1 values (@i * 2, @i * 5, @i)
    set @i = @i + 1
  end

declare @i int
set @i = 0
while @i < 10000
  begin
    insert T2 values (@i * 3, @i * 7, @i)
    set @i = @i + 1
  end

Frage:

Wie können eine Sonde und ein Residuum dieselbe Säule sein? Warum kann SQL Server nicht nur die Testspalte verwenden? Warum muss dieselbe Spalte als Residuum verwendet werden, um Zeilen erneut zu filtern?

Referenzen für Testdaten:

21
TheGameiswar

Befindet sich der Join in einer einzelnen Spalte, die als tinyint, smallint oder integer * eingegeben wurde, und wenn beide Spalten auf NOT NULL Eingeschränkt sind, wird die Hash-Funktion verwendet ist 'perfekt' - das heißt, es besteht keine Möglichkeit einer Hash-Kollision, und der Abfrageprozessor muss die Werte nicht erneut überprüfen, um sicherzustellen, dass sie wirklich übereinstimmen.

Andernfalls wird ein Residuum angezeigt, wenn Elemente im Hash-Bucket auf eine Übereinstimmung getestet werden, nicht nur auf eine Übereinstimmung mit der Hash-Funktion.

Ihr Test gibt nicht NULL oder NOT NULL Für die Spalten an (übrigens eine schlechte Praxis), daher verwenden Sie anscheinend eine Datenbank, in der NULL die Standardeinstellung ist.

Weitere Informationen in meinem Beitrag Join-Leistung, implizite Konvertierungen und Residuen und Hash Join Execution Internals von Dmitry Pilugin.


* Andere qualifizierende Typen sind Bit , smalldatetime , smallmoney und (var) char (n) für n = 1 und binäre Kollatierung

22
Paul White 9