READPAST ipucu neden dizinlenmiş görünümlerin yok sayılmasına neden oluyor?


10

READPASTUygulamamızın finansal alt sistemindeki kaynak kilitlenmesini azaltmak için ipucunu kullanarak araştırıyorum .

Finansal işlem kayıtları yalnızca eklendiği, hiç güncellenmediği veya silinmediği için iyi bir yol gibi görünüyordu. Atlanacak tek satır, bir işlemin içine eklenen yeni satırlardır; işlem yapılıncaya kadar dış dünyaya etkin bir şekilde var olmazlar.

Ancak, ben READPASTipucu koymak dizinlenmiş görünümler kullanan sorgularda kötü performans fark ettim . Sorgu planlarını karşılaştırarak ipucuna benziyor, sorgu optimize edici dizinlenmiş görünümü kullanmamayı seçiyor ve bunun yerine normal bir görünüm gibi davranmaya geri dönüyor.

Bunun neden olacağından emin değilim; Dizinlenmiş görünümleri işlemleri sırasında kilitlenebilir ve ekleme READPASTbenzer şekilde çalışacak diğer dizin gibi olması hayal .

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST)
WHERE isa.TotalOwedAmount = 0.0

resim açıklamasını buraya girin

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa
WHERE isa.TotalOwedAmount = 0.0

resim açıklamasını buraya girin

NOEXPANDYanı sıra bir ipucu eklemek işe yarıyor gibi görünüyor, ama muhtemelen neden READPAST(tam bir cevabın bir parçası olarak) ilk etapta bu seçeneği yapmak için sorgu optimizer neden neden hakkında daha fazla bilgi edinmek istiyorum .

Yanıtlar:


7

Makalemdeki örnek tabloyu ve dizine alınmış görünümü yeniden kullanma Enterprise Edition'da Kullanmak İçin Başka NedenlerNOEXPAND :

CREATE TABLE dbo.T
(
    col1 integer NOT NULL
);
GO
INSERT dbo.T WITH (TABLOCKX)
    (col1)
SELECT 
    SV.number
FROM master.dbo.spt_values AS SV
WHERE 
    SV.type = N'P';
GO
CREATE VIEW dbo.VT
WITH SCHEMABINDING
AS
SELECT T.col1 
FROM dbo.T AS T;

reprodüksiyon

Bu sorgu, dizine alınan görünümle eşleşir (yedek toplamı olsa da):

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT;

Dizine eklenen görünüm eşleşti

READPASTİpucu eklemek temel tabloya erişmenize neden olur:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

Dizine eklenen görünüm eşleşmedi

açıklama

READPASTİpucu semantik-etkiliyor. Optimize edici, sonuçlar değişecek şekilde yeniden yazma sorgularına direnir. Örneklemek gerekirse:

Aşağıdaki sorgu sorunsuz yürütülür:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

Ancak:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST)
OPTION 
    (TABLE HINT (VT, FORCESCAN));

Hatayı üretir:

Msg 8722, Seviye 16, Durum 1, Satır 42
Sorgu yürütülemiyor.
Anlamsallığı etkileyen 'readpast' ipucu 'VT' nesnesinin 'WITH' yan tümcesinde görünür
ancak karşılık gelen 'TABLO İPUCU' yantümcesinde değil.
SEÇENEK (TABLO İPUÇLARI ...) yan tümcesini, anlambilimi etkileyen ipuçlarını değiştirin
WITH yan tümcesiyle eşleşir.

Dizine alınmış görünüme NOEXPANDipucu olmadan başvurduğunuzda, görünüm temeldeki nesnelere başvurmak üzere genişletilir (derleme ve en iyileştirme başlamadan önce). İşlemin ilerleyen bölümlerinde, iyileştirici sorgu ağacını tamamen veya kısmen dizine alınmış bir görünümle eşleştirmeyi düşünebilir.

Zaman READPASTolmadan kullanılan NOEXPAND, ipucu yayar görünüşüdür eşlemeyi (çeşitli semantik) önlenmesi, temel tablo.

İle NOEXPAND, ipucu doğrudan görünüm için geçerlidir, bu yüzden sorun 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.