CREATE INDEX…WITH ONLINE = ONが数分にわたってテーブルへのアクセスをブロックするのはなぜですか?


22

既存のテーブルがあります:

CREATE TABLE dbo.ProofDetails
(
    ProofDetailsID int NOT NULL 
        CONSTRAINT PK_ProofDetails 
        PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , ProofID int NULL
    , IDShownToUser int NULL
    , UserViewedDetails bit NOT NULL 
        CONSTRAINT DF_ProofDetails_UserViewedDetails 
        DEFAULT ((0))
);

このテーブルには150,000,000行があります。システムは24時間365日稼働しているため、定期的にメンテナンスウィンドウが発生することはありません。

テーブルにインデックスを追加したいのですが、SQL ServerのEnterpriseエディションでは、テーブルへの書き込みアクセスをブロックせずにインデックスを追加できるはずです。使用したコマンドは次のとおりです。

CREATE INDEX IX_ProofDetails_ProofID_Etc 
ON dbo.ProofDetails (ProofID, IDShownToUser)
INCLUDE (UserViewedDetails)
WITH (ONLINE=ON
    , ALLOW_ROW_LOCKS=ON
    , ALLOW_PAGE_LOCKS=ON
    , FILLFACTOR=100
    , MAXDOP=4
);

を押して、SSMSでステートメントを単独で実行しましたF5。1分以上実行された後、他のセッションをブロックし始めました。CREATE INDEX他のセッションをブロックできないため、コマンドをすぐにキャンセルしました。

最初の1分間は、CREATE INDEXコマンドをブロックするものは何もありませんでした。もちろんsys.dm_exec_requests、待機タイプのプロセスを示しましたCXPACKET。操作が並列化されたので、それは悪いことではないと思います。

の出力を調べる時間はあまりありませんでしたsys.dm_exec_requests。クエリから返された行は1つだけでしたWHERE session_id = xxx。ブロックされたセッションは、ターゲットテーブルに行を挿入しようとしました。

ロックがどのくらい続いたかはわかりませんが、ステートメントの実行を開始してから約2分後にキャンセルしたということを除きます。その時点でブロックが約1分間発生していました。

の実装を誤解していWITH (ONLINE=ON)ますか?または、他に注意する必要があるものはありますか?

サーバーは、2つのクアッドコアXeon E5-2643 3.3Ghzプロセッサー、192GB RAM、および5,000以上のiopsが可能なSANストレージを備えた、かなり頑丈なマシンです。通常、CPUは20%未満、RAMは93%が使用されますが、ほとんどはSQL Serverによって使用されます。ボックス上で実行されるものは他にありません。WindowsServer 2012とSQL Server 2012だけです。

回答:


23

online = onでインデックスを作成する場合、インデックスオブジェクト自体の作成時にインデックス作成プロセスはブロックされませんが、プロセスの終わり近くになると、実際に一定期間スキーマ変更ロック*を取得しますテーブルにインデックスを追加すると、このロックタイプは、ロックが解除されるまですべての外部操作をブロックします。これにより、ブロックの問題が発生する可能性があります。

* Sch-M新しい非クラスター化インデックスのオンラインビルドにはロックは必要ありませんが、他のすべての場合には必要です。新しい非クラスター化インデックスは、準備段階で必要だったのと同じように、最終段階でテーブルレベルの共有ロックのみを必要とします。

詳細については、このホワイトペーパーを参照してください。

SQL Server 2005のオンラインインデックス作成操作

Mushtaq Mohammedが質問に対するコメントで示唆したように、以下も参照してください。

Paul Randalによるユニコーン、レインボー、オンラインインデックス操作

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