READPASTヒントにより、インデックス付きビューが無視されるのはなぜですか?


10

このREADPASTヒントを使用して、アプリケーションの金融サブシステムのリソースロックを削減することを調査しています。

金融取引記録は追加されるだけで、更新または削除されることはないため、良い方法のように思えました。スキップされる行は、トランザクション内に挿入された新しい行のみです。トランザクションがコミットされるまで、それらは事実上外界には存在しません。

ただし、READPASTヒントを付けたインデックス付きビューを使用するクエリのパフォーマンスが低下していることに気付きました。クエリプランを比較すると、ヒントのように見えます。クエリオプティマイザーは、インデックス付きビューを使用しないことを選択し、代わりに通常のビューのように扱います。

それがなぜかはわかりません。インデックス付きビューは、操作中にキーをロックでき、追加READPASTも同様に機能するという点で、他のインデックスと同じだと思います。

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

NOEXPANDヒントの追加も機能するようですREADPASTが、クエリオプティマイザーがそもそもなぜ(完全な回答の一部として)選択したのか、おそらくその理由について詳しく知りたいと思います。

回答:


7

Enterprise Editionでヒントを使用するもう1つの理由NOEXPANDからのサンプルテーブルとインデックス付きビューの再利用:

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;

再現

このクエリは、インデックス付きビューに一致します(冗長な集計はあります)。

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

一致したインデックス付きビュー

READPASTヒントを追加すると、ベーステーブルにアクセスします。

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

インデックス付きビューが一致しません

説明

READPASTヒントは、セマンティックに影響を及ぼします。オプティマイザは、結果が変化するようにクエリを書き換えるのを防ぎます。説明する:

次のクエリは問題なく実行されます。

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

しかしながら:

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

エラーを生成します:

メッセージ8722、レベル16、状態1、行42
クエリを実行できません。
意味に影響を与えるヒント「readpast」がオブジェクト「VT」の「WITH」句に表示されます
ただし、対応する「TABLE HINT」句にはありません。
OPTION(TABLE HINTS ...)句を変更して、意味に影響を与えるヒント
WITH句と一致します。

NOEXPANDヒントなしでインデックス付きビューを参照すると、ビューは(コンパイルと最適化が始まる前に)展開され、代わりに基礎となるオブジェクトを参照します。プロセスの後の方で、オプティマイザはクエリツリーをインデックス付きビューに全体的または部分的に照合することを検討します。

場合READPASTせずに使用されNOEXPAND、ヒントは伝播ビュー・マッチング(異なる意味を)防止、ベーステーブルへ。

を使用するNOEXPANDと、ヒントはビューに直接適用されるため、問題はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.