1

現在、クライアントの 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私には、ここに行く唯一の方法のように見えますか?

4

2 に答える 2

0

テーブルロックのようです。

ETL プロセスで部分挿入を試行します。何かのようなもの

while 1=1
begin

   INSERT INTO ProductionTable(field1,field2)
   SELECT top (1000) field1, field2
   FROM SourceHeapTable sht (nolock)
   where not exists (select 1 from ProductionTable pt where pt.id = sht.id)

   -- optional
   --waitfor delay '00:00:01.0'

   if @@rowcount = 0 
      break;

end
于 2013-06-18T09:11:12.183 に答える