3

product_titleParts テーブルに継続的にデータを挿入するバックグラウンド ジョブ (C# コンソール アプリケーション) があります。このジョブは単純に、products テーブルから上位 100 個の製品を選択し、タイトルを部分に分割し、product_titleParts テーブルに挿入します。

このテーブルには、「TitlePart」というインデックス付きの列があります

一方、このテーブルから選択しようとすると、SQL クエリに時間がかかります。しばらくしてコンソール アプリを停止すると、クエリに 0 秒かかります。コンソール アプリを再度起動するとすぐに、応答しないクエリを再度選択します。

別のジョブが挿入されている間にテーブルから選択すると、速度が低下しますか? 選択時に nolock を使用していますが、役に立ちませんでした。

何か案が?

コンソール アプリのマイ コード:

if not exists(select 1 from product_titleParts where productid = @productid
and UserId = @userid and titlePart = @titlePart)
begin
insert into product_titleParts (userid, productid, titlePart)
VALUES (@userid, @productid, @titlePart)
end

私の選択コード:

select productid from product_titleParts 
inner join products
on products.productid = product_titleParts.productid
where titlePart = @titlePart
4

1 に答える 1

0

一方、選択中に「大量データ」を挿入すると、同様の問題が発生しました(DB/2)

私の解決策は何でしたか:

挿入は高価なので、次のようなブロックに結び付けました。

 insert into ...
 values ((a,b,c),(x,y,z), ... )

たとえば、テーブルを一度だけロックします。100 個の挿入とインデックスは 1 回だけ再構築されます

もう 1 つのポイントがあります。多くの行を挿入 (更新) する場合は、排他モードでテーブルをロックしてみてください (DBMS によって異なります)。「ロックエスカレーション」と呼ばれるものを防ぎます

DB2 で使用する

   lock table xyz in exclusive mode
   update/insert many rows
   unlock table xyz
于 2013-07-18T22:29:19.910 に答える