Predicate Ara ve Predicate Arasındaki Fark


12

Performans biz SQL Server 2014 Enterprise bir sorgu ayarlamaya çalışıyorum.

SQL Sentry Plan Explorer'da gerçek sorgu planını açtım ve bir düğümde bir Arama Predicate ve ayrıca bir Predicate olduğunu görebilirsiniz

Arasındaki fark nedir Seek Predicate ve Predicate ?

resim açıklamasını buraya girin

Not: Bu düğümde (ör. Tahmini ve Gerçek satırlar, kalan GÇ) birçok sorun olduğunu görebiliyorum, ancak soru bunun hiçbiriyle ilgili değil.


3
Arama yüklemi, yalnızca diğer tabloda da bulunan (redaksiyon yaptığınız) satırlara filtre uygulayarak birleştirme işlemine yardımcı olur. Yüklem (artık yüklem) daha sonra 2'nin özel statüsüne sahip satırları ortadan kaldırır.
Aaron Bertrand

5
Rob Farley yorumunda şunları belirtti burada :The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Aaron Bertrand

Yanıtlar:


18

Birkaç sütunla birlikte geçici tabloya bir milyon satır atalım:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);

INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM 
(
    SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
    FROM   master..spt_values v1,
           master..spt_values v2
) t;

CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);

Burada PKsütun üzerinde kümelenmiş bir dizin (varsayılan olarak) var . Üzerinde COL1anahtar sütunu olan COL1ve içeren kümelenmemiş bir dizin var COL2.

Aşağıdaki sorguyu düşünün:

SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;

Burada kullanmıyorum BETWEENçünkü Aaron Bertrand bu sorunun etrafında duruyor.

SQL Server bu sorguyu nasıl optimize etmelidir? Açık olan filtrenin PKsonuç kümesini beş satıra indireceğini biliyorum . SQL sunucusu, tablodaki tüm milyon satırları okumak yerine bu beş satıra atlamak için kümelenmiş dizini kullanabilir. Ancak, kümelenmiş dizin anahtar sütun olarak yalnızca PK sütununa sahiptir. Satır belleğe okunduktan sonra filtreyi uygulamalıyız COL2. Burada, PKbir arama yüklemidir ve COL2bir yüklemdir.

resim açıklamasını buraya girin

SQL sunucusu, arama yüklemini kullanarak beş satır bulur ve bu beş satırı normal yüklemle bir satıra azaltır.

Kümelenmiş dizini farklı şekilde tanımlarsam:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);

Ve aynı sorguyu çalıştırmak Farklı sonuçlar alıyorum:

resim açıklamasını buraya girin

Bu durumda, SQL Server WHEREyan tümcesinde her iki sütun kullanarak arama yapabilirsiniz . Anahtar sütunlar kullanılarak tablodan tam olarak bir satır okunur.

Bir örnek daha bu sorguyu düşünün:

SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;

IX_174860_IX dizini, sorgu için gereken tüm sütunları içerdiğinden bir kaplama dizinidir. Ancak, yalnızca COL1bir anahtar sütundur. SQL Server, eşleşen bir COL1değere sahip 1000 satırı bulmak için bu sütunu arayabilir . COL2Son sonucu 0 sıraya düşürmek için sütundaki bu satırları daha fazla filtreleyebilir .

resim açıklamasını buraya girin

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.