Aşağıdaki sorgularda her iki uygulama planının da benzersiz bir endekste 1000 deneme gerçekleştireceği tahmin edilmektedir.
Arayışlar, aynı kaynak tabloda sıralı bir tarama tarafından yönlendirilir, bu nedenle aynı sırayla aynı değerleri aramaya başlamalıdır.
Her iki iç içe döngü var <NestedLoops Optimized="false" WithOrderedPrefetch="true">
Bu görevin neden ilk planda 0.172434'e, ikincide 3.01702'ye mal olduğunu bilen var mı?
(Sorunun sebebi, ilk sorgunun, görünen maliyetin çok düşük olması nedeniyle bana bir optimizasyon olarak önerilmesiydi. Aslında daha fazla iş yapıyormuş gibi görünüyor, ama ben sadece tutarsızlığı açıklamaya çalışıyorum. .)
Kurmak
CREATE TABLE dbo.Target(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL);
CREATE TABLE dbo.Staging(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL);
INSERT INTO dbo.Target
SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32)
FROM master..spt_values v1,
master..spt_values v2;
INSERT INTO dbo.Staging
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32)
FROM master..spt_values v1;
Sorgu 1 "Planı yapıştır" bağlantısı
WITH T
AS (SELECT *
FROM Target AS T
WHERE T.KeyCol IN (SELECT S.KeyCol
FROM Staging AS S))
MERGE T
USING Staging S
ON ( T.KeyCol = S.KeyCol )
WHEN NOT MATCHED THEN
INSERT ( KeyCol, OtherCol )
VALUES(S.KeyCol, S.OtherCol )
WHEN MATCHED AND T.OtherCol > S.OtherCol THEN
UPDATE SET T.OtherCol = S.OtherCol;
Sorgu 2 "Planı yapıştırın" bağlantısı
MERGE Target T
USING Staging S
ON ( T.KeyCol = S.KeyCol )
WHEN NOT MATCHED THEN
INSERT ( KeyCol, OtherCol )
VALUES( S.KeyCol, S.OtherCol )
WHEN MATCHED AND T.OtherCol > S.OtherCol THEN
UPDATE SET T.OtherCol = S.OtherCol;
Sorgu 1
Sorgu 2
Yukarıdakiler SQL Server 2014 (SP2) üzerinde test edildi (KB3171021) - 12.0.5000.0 (X64)
@Joe Obbish yorumlarda daha basit bir repro olacağına işaret ediyor
SELECT *
FROM staging AS S
LEFT OUTER JOIN Target AS T
ON T.KeyCol = S.KeyCol;
vs
SELECT *
FROM staging AS S
LEFT OUTER JOIN (SELECT * FROM Target) AS T
ON T.KeyCol = S.KeyCol;
1.000 sıra evreleme tablosu için yukarıdakilerin her ikisi de hala iç içe döngülerle aynı plan şekline ve türetilmiş masa daha ucuz görünmeyen plana sahiptir , ancak 10.000 sıra evreleme masası ve aynı hedef tablo için yukarıdaki maliyetler arasındaki fark planı değiştirir Şekil (tam tarama ve birleştirme birleşimi, pahalı maliyetlere sahip aramalardan nispeten daha çekici görünüyordu), bu maliyet farkını göstermenin sadece planları karşılaştırmayı zorlaştırmaktan başka etkileri olabilir.