SQL Server 2012'de iki büyük sonuç kümesini karşılaştırmanın en etkili yolu nedir


9

İki büyük sonuç / sıra kümesini karşılaştırmanın en etkili yolu için şu anki tavsiye EXCEPToperatörü kullanmak gibi görünmektedir . Bu bağımsız SQL komut dosyası, satır boyutları arttıkça (verim @ son değerleri değiştirdikçe) çok verimsiz hale gelir. Kombine bir tabloda benzersiz girişler bulmaya çalıştım, ancak iyileştirme yapmadım.

DECLARE @first AS INT, @step AS INT, @last AS INT; 

-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible

-- Compare 100 to 110 rows - 0 seconds
-- Compare 1000 to 1010 rows - 1 seconds
-- Compare 10000 to 10010 rows - 16 seconds
-- Compare 100000 to 100010 rows - ABORT after 8 minutes (tables are populated in 18 seconds)

DECLARE @temptableOLD TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100000
WHILE(@first <= @last) BEGIN INSERT INTO @temptableOLD VALUES(@first) SET @first += @step END

DECLARE @temptableNEW TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100010
WHILE(@first <= @last) BEGIN INSERT INTO @temptableNEW VALUES(@first) SET @first += @step END

select * from @temptableNEW
except
select * from @temptableOLD

Yanıtlar:


8

EXCEPTbir DISTINCTişlem anlamına gelir .

NOT EXISTSBu aslında gerekli değilse kullanırım .

Ancak, karşılaştığınız sorun büyük olasılıkla tablo değişkenleri ile ilişkili zayıf kardinalite tahminleri nedeniyle dizine eklenmemiş bir tabloda iç içe bir döngü alıyorsanız.

select * from @temptableNEW
except
select * from @temptableOLD
OPTION (RECOMPILE)

Tabloların her birinde 100K satır bulunduğunu ve farklı bir plan verebildiğini dikkate alabilecektir.

SQL Server 2012'de yalnızca tablo değişkenlerine kısıtlamalar yoluyla dizin ekleyebilirsiniz. Değerler benzersizse kullanabilirsiniz

DECLARE @temptableOLD TABLE ([Result1] int UNIQUE CLUSTERED);

dizin eklemek için. Her iki tabloda da yapılırsa, plan (yeniden derleme ipucu eklendikten sonra) bunun yerine bir birleştirme birleşimi kullanır. Herhangi bir dizin olmadan bir karma katılmak beklenir.


Teşekkürler Martin. Cevap bu. SEÇENEK (TAVSİYE) yardımcı oldu (5 dakikada 100.000), ancak her iki tabloda da benzersiz KÜMELENMİŞ (7 saniyede 100.000 !!!) büyük gelişme sağladı. Ben sadece iki farklı SQL sunucuları üzerinde tablo indeksleme üzerinde hiçbir kontrol var gerçek bir yaşam sorunu göstermek için bu tabloları yarattı, ama ben böyle tablo değişkenleri ile yönetir.
Will Healey

4
@WillHealey #temptablolarının tablo değişkenlerine (istatistik, paralellik, daha esnek indeksleme) göre birçok avantajı vardır, bu yüzden bunu Tablo değişkenleriyle sınırlı bir bağlamda kullanmıyorsanız bunları da deneyebilirsiniz.
Martin Smith
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.