Products
多くの列で呼び出されるテーブルがあります。これは、レポートの目的で使用される一時的なテーブルです。データは、複数のユーザー要求によって同時にこのテーブルに処理されます。このテーブルに対してDML操作を行うための個別のストアドプロシージャがあります。
テーブル構造:
CREATE TABLE Products (
instance uniqueidentifier,
inserted datetime,
col1,
col2,
...
)
列には、各行が挿入された時刻を含むinserted
データが入力され、列にはからの値が含まれます。1つのユーザーリクエストには1つの一意のIDがありますが、100万行になる場合があります。以下は、デッドロックの原因となる、同時に実行されるクエリです。教えてくださいGETDATE()
instance
newid()
クエリ1:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DELETE P
FROM Products (NOLOCK)
WHERE instance = 'XXXX-xxx-xxx-xx'
クエリ2:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DELETE P
FROM Products (NOLOCK)
WHERE inserted <= DATEADD(hh, -10, GETDATE())
注:非クラスター化インデックスは、インスタンス列に作成されます。
このシナリオで使用できるロックを教えてください。
テーブルに1,000万行を挿入すると時間がかかるため、主キーを設定できなかったことに注意してください(これは、1つのトランザクションに対して、20の同時トランザクションがあります)。レポートはもっと早く生成する必要があります。そして、私のプロシージャには複数の35のDMLステートメントがあります。インスタンスcolumnと他のcolumns(DELETE FROM table WHERE instance = @instance AND col1 = @col1
)には約15のDELETEステートメントがあります。