En büyük fark birleşme içinde değil, var olmadığıdır (olduğu gibi) SELECT *
.
İlk örnekte, sen tüm sütunları almak hem A
ve B
ikinci örnekte, sadece sütunları olsun oysa A
.
SQL Server'da, ikinci değişken çok basit bir bağlamda verilen örnekte biraz daha hızlıdır:
İki örnek tablo oluşturun:
CREATE TABLE dbo.A
(
A_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
CREATE TABLE dbo.B
(
B_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
GO
Her tabloya 10.000 satır ekleyin:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Her 5. sırayı ikinci tablodan çıkarın:
DELETE
FROM dbo.B
WHERE B_ID % 5 = 1;
SELECT COUNT(*) -- shows 10,000
FROM dbo.A;
SELECT COUNT(*) -- shows 8,000
FROM dbo.B;
İki test SELECT
ifadesi değişkenini gerçekleştirin:
SELECT *
FROM dbo.A
LEFT JOIN dbo.B ON A.A_ID = B.B_ID
WHERE B.B_ID IS NULL;
SELECT *
FROM dbo.A
WHERE NOT EXISTS (SELECT 1
FROM dbo.B
WHERE b.B_ID = a.A_ID);
İcra planları:
İkinci varyantın sol anti-yarı birleştirme operatörünü kullanabilmesi nedeniyle filtre işlemini gerçekleştirmesi gerekmez.
WHERE A.idx NOT IN (...)
olduğunu değil aynı dolayı üç değerlikli davranışınaNULL
(yaniNULL
eşit değildirNULL
Sahip nedenle eğer) (ne de eşitsiz herhangiNULL
içindetableB
size beklenmedik sonuçlar alırsınız!)