EXCEPT operatörünün arkasındaki algoritma nedir?


10

Except operatörünün SQL Server'daki kapaklar altında nasıl çalıştığının iç algoritması nedir ? Dahili olarak her satırın bir karmasını alır ve karşılaştırır mı?

David Lozinksi bir çalışma yürüttü, SQL: Henüz mevcut olmayan yeni kayıtlar eklemenin en hızlı yolu , İfade ifadesinin çok sayıda satır için en hızlı olduğunu gösterdi; aşağıdaki sonuçlarımızla yakından bağlantılıdır.

Varsayım: Sadece 1 sütunu karşılaştırdığı için Sol birleştirmenin en hızlı olacağını düşünürüm, Tüm sütunları karşılaştırmak zorunda olduğu için en uzun süreceği hariç.
Bu sonuçlarla, şimdi düşüncemiz otomatik olarak ve dahili olarak her satırdan bir karma alır? İnfaz planı dışında baktım ve bazı karma kullanır.

Arka plan: Ekibimiz iki yığın tablosunu karşılaştırıyordu. Tablo A Tablo B'de olmayan satırlar Tablo B'ye eklenmiştir.

Yığın tablolarında (eski metin dosya sisteminden) birincil anahtarlar / kılavuzlar / tanımlayıcılar yoktur. Bazı tabloların yinelenen satırları vardı, bu nedenle her satırın Hash'ini bulduk ve yinelemeleri kaldırdık ve Birincil anahtar tanımlayıcıları oluşturduk.

1) Öncelikle (karma sütunu) hariç, bir dışlama ifadesi çalıştırdık

select * from TableA
Except
Select * from TableB,

2) Sonra HashRowId üzerinde iki tablo arasında bir karşılaştırma birleştirme koştu

select * 
FROM dbo.TableA A
left join dbo.TableB B
    on A.RowHash =  B.RowHash
where B.Hash is null

şaşırtıcı bir şekilde Hariç İfadesi Ekle en hızlı oldu.

Sonuçlar aslında David Lozinksi'nin test sonuçlarına yakın harita

resim açıklamasını buraya girin


Yanıtlar:


10

Except operatörünün SQL Server'daki kapaklar altında nasıl çalıştığının iç algoritması nedir?

İçin özel bir iç algoritma olduğunu söyleyemem EXCEPT. Bunun için A EXCEPT B, motor A'dan ayrı (gerekirse) tuples alır ve B'de eşleşen satırları çıkarır. Özel bir sorgu planı operatörü yoktur. Farklı ve çıkarma, bir sıralama veya birleştirme ile göreceğiniz tipik işleçler aracılığıyla uygulanır. İç içe döngü birleştirme, birleştirme birleştirme ve karma birleştirme desteklenir. Bunu göstermek için, bir çift yığın içine 15 milyon sıra atacağım:

DROP TABLE IF EXISTS dbo.TABLE_1;

CREATE TABLE dbo.TABLE_1 (
    COL1 BIGINT NULL,
    COL2 BIGINT NULL
);

INSERT INTO dbo.TABLE_1 WITH (TABLOCK)
SELECT TOP (15000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), NULL
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);


DROP TABLE IF EXISTS dbo.TABLE_2;

CREATE TABLE dbo.TABLE_2 (
    COL1 BIGINT NULL,
    COL2 BIGINT NULL
);

INSERT INTO dbo.TABLE_2 WITH (TABLOCK)
SELECT TOP (15000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), NULL
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);

Optimize edici, sıralamanın ve birleştirmenin nasıl uygulanacağı konusunda her zamanki maliyete dayalı kararlar verir. İki yığın ile beklendiği gibi bir karma katılmak olsun. Dizin ekleyerek veya her iki tabloda da verileri değiştirerek diğer birleştirme türlerini doğal olarak görebilirsiniz. Aşağıda sadece açıklama amacıyla birleştirme ve döngü birleşimlerini ipuçları ile zorlarım:

katılır

Dahili olarak her satırın bir karmasını alır ve karşılaştırır mı?

Hayır. Diğer bir birleşim olarak uygulanır. Bir fark NULL'lara eşit muamele edilmesidir. Bu yürütme planında görebileceğiniz karşılaştırmanın özel bir türüdür: <Compare CompareOp="IS">. Ancak, aynı planı EXCEPTanahtar kelimeyi içermeyen T-SQL ile alabilirsiniz . Örneğin, aşağıdakiler, EXCEPTbir karma birleştirmeyi kullanan sorgu ile tam olarak aynı sorgu planına sahiptir :

SELECT t1.*
FROM
(
    SELECT DISTINCT COL1, COL2
    FROM dbo.TABLE_1
) t1
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.TABLE_2 t2
    WHERE (t1.COL1 = t2.COL1 OR (t1.COL1 IS NULL AND t2.COL1 IS NULL))
    AND (t1.COL2 = t2.COL2 OR (t1.COL2 IS NULL AND t2.COL2 IS NULL))
);

Yürütme planlarının XML'sini dağıtmak yalnızca takma adlar ve bunun gibi şeyler arasındaki yüzeysel farklılıkları ortaya çıkarır. Karma birleşimleri için prob kalıntıları satır karşılaştırmasını yapar. Her iki sorgu için de aynıdır:

resim açıklamasını buraya girin

Hala şüpheleriniz varsa, ben ile sorgu ve sorgu olmadan çağrı yığınları almak için mevcut en yüksek örnek oranı ile PerfView koştu EXCEPT. Sonuçlar yan yana:

resim açıklamasını buraya girin

Gerçek bir fark yok. Plandaki karma eşleşmelerden dolayı referans karma işleminde çağrı yığınları mevcuttur. Doğal birleştirme katılmak için dizinler eklerseniz, çağrı yığınlarında karma için herhangi bir başvuru görmezsiniz:

resim açıklamasını buraya girin

Meydana gelen her karma, karma eşleme işleçlerinin uygulanmasından kaynaklanır. EXCEPTÖzel, dahili bir hash karşılaştırmasına yol açan özel bir şey yoktur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.