Angenommen, wir haben eine Abfrage wie die folgende:
select a.*,b.*
from
a join b
on a.col1=b.col1
and len(a.col1)=10
Angenommen, die obige Abfrage verwendet einen Hash-Join und hat einen Residuum, dann ist der Prüfschlüssel col1
und der Residuum len(a.col1)=10
.
Aber als ich ein anderes Beispiel durchging, konnte ich sehen, dass sowohl die Sonde als auch das Residuum dieselbe Spalte waren. Nachfolgend eine Ausarbeitung dessen, was ich versuche zu sagen:
Abfrage:
select *
from T1 join T2 on T1.a = T2.a
Ausführungsplan mit hervorgehobener Sonde und Restmenge:
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 kann eine Sonde und ein Residuum dieselbe Spalte sein? Warum kann SQL Server nicht nur die Testspalte verwenden? Warum muss dieselbe Spalte als Residuum verwendet werden, um die Zeilen erneut zu filtern?
Referenzen für Testdaten:
quelle