既存のテーブルがあります:
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だけです。