Geçici tablolar ve tablo değişkeni arasındaki INSERT performans farkı


12

SQL Server 2005'te aşağıdaki sorun var: bir tablo değişkenine bazı satırlar eklemeye çalışmak geçici tablo kullanarak aynı ekleme karşılaştırıldığında çok zaman alır.

Bu, tablo değişkenine eklenecek koddur

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...

Bu geçici tabloya eklenecek kod

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data

Geçici tablonun herhangi bir anahtarı veya dizini yoktur, seçim bölümü 2 sorgu arasında aynıdır ve seçim tarafından döndürülen sonuç sayısı ~ 10000 satırdır. Yalnızca seçimi gerçekleştirmek için gereken süre ~ 10 saniyedir.

Geçici tablo sürümü yürütmek için 10 saniye sürer, 5 dakika sonra tablo değişken sürümünü durdurmak zorunda kaldı.

Sorgu geçici tablo erişimine izin vermeyen bir tablo değeri işlevinin bir parçası olduğundan bir tablo değişkeni kullanmak zorunda.

Tablo değişkeni sürümü için yürütme planı Yürütme planı

Geçici tablo sürümü için yürütme planı Yürütme planı

Yanıtlar:


8

İki plan arasındaki bariz fark, hızlı planın paralel ve yavaş olanın seri olmasıdır.

Bu, tablo değişkenlerine eklenen planların sınırlamalarından biridir. Yorumlarda belirtildiği gibi (ve istenen etkiye sahip gibi görünüyor)

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')

bunun sınırlamadan geçip geçmediğini görmek.


Gerçi EXECbir işlev üzerinde kullanamadım olsa da harika bir öneriydi .... Sanırım yanılmışım
Lamak

1
@Lamak - Doh! Bu OP için işe yaramaz böylece olamaz. Invalid use of a side-effecting operator 'INSERT EXEC' within a function.. Etrafında çalışma olsa kudreti çalışması. OPENQUERY
Martin Smith

Ah, bilmek güzel, açıklama için teşekkürler
Lamak

2
Genel bir kural olarak, döndürülen aset olarak büyük bir veri almayı bekliyorsanız tablo değişkenlerini kullanmak istemezsiniz. Bu durumda sıcaklık tabloları genellikle daha hızlıdır.
HLGEM

1
@munissor, o zaman tablo değerli bir işlev kullanmayın. Daha iyi tavsiye istiyorsanız tam olarak ne yaptığınızı gönderin.
HLGEM

-1

Tablo değişkenleri üzerinde istatistik olmadığı için tablo değişkenleri bazen daha yavaştır ve bu nedenle optimize edici her zaman yalnızca bir kayıt kabul eder.

Ancak burada böyle olduğunu garanti edemez, tablo değişkeni için sorgu planında "tahmini satır" bilgisine bir göz atmanız gerekir.


Bu tablo değişkenine bir ekleme nasıl etkilenir?
Martin Smith

Paralel ve seri arasında değil, aynı zamanda karma ve iç içe döngü birleşimleri arasında da bir fark olmadığını görebileceğiniz gibi, görünüşe göre optimizer, tablo değişkeninin aklında bir kayıt tuttuğundan sonuç olarak sorgusu da tek bir kayıt olacak, bir kez daha sorgunun her bir kısmı için gerçek istatistikleri görmenin tek yoludur, ancak gerçek şu ki, tablo değişkenlerini içeren tüm sorguların döngü birleştirmeleri ve seri işleme ile sonuçlanması, bu yüzden burada şüphelenmek adil
yoel halb
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.