現在、クライアントの MSSQL サーバーで分析を行っています。すでに多くの問題 (不要なインデックス、インデックスの断片化、NEWID()
ショップ全体で ID に使用されているなど) を修正しましたが、これまでに見たことのない特定の状況に遭遇しました。
プロセス 1 はデータをステージング テーブルにインポートし、次にプロセス 2 は を使用してステージング テーブルからデータをコピーしますINSERT INTO
。最初のプロセスは非常に高速ですが ( を使用BULK INSERT
)、2 番目のプロセスは実行に約 30 分かかります。プロセス 2 の「問題」の SQL は次のとおりです。
INSERT INTO ProductionTable(field1,field2)
SELECT field1, field2
FROM SourceHeapTable (nolock)
上記の INSERT ステートメントは、数十万のレコードを ProductionTable に挿入し、各行に を割り当て、UNIQUEIDENTIFIER
約 5 つの異なるインデックスに挿入します。このプロセスには時間がかかることを承知しているので、私の問題は次のとおりです。このインポートが行われている間、3番目のプロセスがProductionTableで一定のルックアップを実行する責任があります-追加のレコードをテーブルに挿入することに加えて:
INSERT INTO ProductionTable(fields...)
VALUES(values...)
SELECT *
FROM ProductionTable (nolock)
WHERE ID = @Id
INSERT...SELECT
上記が行われている約30分間、INSERT INTO
タイムアウトします。
私がすぐに考えたのは、SQL サーバーがINSERT...SELECT
. 分析中にサーバーでかなり多くのプロファイリングを行いました.ロックの期間中に割り当てられているロックは間違いなくありますが、INSERT...SELECT
それらがどのタイプであったか覚えていません.
2 つのソースからテーブルに同時にレコードを挿入する必要がなかったので (少なくとも ETL プロセス中)、これにどのようにアプローチすればよいかわかりません。テーブルのヒントを調べてきましたINSERT
が、ほとんどは将来のバージョンで廃止される予定です。
CURSOR
私には、ここに行く唯一の方法のように見えますか?