1

マイクロソフトの記事のように、パーティションスイッチングを使用して、ステージングテーブルのインデックスをパーティションテーブルにドロップせずに再構築しています。

私は要約すると

BEGIN TRAN
ALTER INDEX IX_Working ON dbo.WorkingTable DISABLE

INSERT INTO dbo.WorkingTable ( Id, PartitionColumn, Values...)
SELECT Id, PartitionColumn, Values...
FROM PartitionedTable WITH (HOLDLOCK)
WHERE PartitionColumn <= @rightboundary
AND PartitionColumn > @leftboundary

INSERT INTO WorkingTable ( Id, PartitionColumn, Values...)
SELECT Id, PartitionColumn, Values...
FROM Imports

ALTER INDEX IX_Working ON WorkingTable REBUILD -- SLOW BIT

ALTER TABLE PartitionedTable SWITCH PARTITION @partition TO SwapTable
ALTER TABLE WorkingTable SWITCH TO PartitionedTable PARTITION @partition

TRUNCATE TABLE SwapTable
COMMIT

この操作中に、インデックスが再作成されるパーティションへの更新をブロックする必要がありますが、それでも他のパーティションでそれらを許可します。PartionedTableでは、ロックエスカレーションが自動に設定されています。HOLDLOCKを使用してこれを実行しようとしていますが、低速ビット中に別の接続からINSERT INTO PartionedTable(Id、@ somevalueInTheRange、Values ...)を実行できます。

選択を許可しながらこれをブロックするにはどうすればよいですか?

4

1 に答える 1

0

TABLOCKX を HOLDLOCK と一緒に使用できますか? 現在、select は、HOLDLOCK のために解放されない SHARED ロックを設定します。ただし、SHARED ロックは挿入を妨げません。

于 2012-11-07T21:19:44.070 に答える