2016-09-20 4 views
-1

条件を満たしたときにテーブルを更新するマージクエリがあり、それを満たさない場合はレコードを別のテーブルに挿入します。問題は、この特定の挿入は、15,000レコードを挿入するのに25分ほどかかります。私が見つけたのは、レコードを挿入する際に、シーケンスIDを挿入しています。シーケンスIDは、それに関連付けられたトリガーによって生成されます。トリガは2つのテーブルから最大IDを選択します。そのため、maxに1を加算して返すので、Insertクエリで使用されます。 これは、私のストアドプロシージャでインサートが遅くなる正確な理由ですか?このSPはDB2上で動作します。DB2に長時間を要する挿入物

+0

このプロセスは、行単位の行処理を使用している可能性があります。セットベースのソリューションが見つかるかどうかを見てください。 – HLGEM

+2

クエリプランを見ると、ボトルネックが何であるかが正確にわかります。シーケンス番号を生成する方法は一般的に、パフォーマンスが悪いだけでなく競合状態の可能性もあるため、非常に悪いアイディアです。 – mustaccio

+0

DBがテーブルに2つのインデックスを保持している場合、挿入は2倍長くなります。 50の索引は、50倍の時間がかかります。一部のOSでは、索引が実際に必要になるまで一意でない索引をオフにすることができます。または、IDを取得したテーブルにIDのユニークなインデックスが必要です。私は30kidsを予約して、あなたのIDを無駄にするよりも速く作業をします。 – danny117

答えて

0

トリガーはパフォーマンスには適していません。テーブルのautoincrementカラムを使用してください。

0

ボトルネックは確かにトリガーでした。私はトリガを落としてspを走らせたが、約2時間で15kレコードを挿入した。私はトリガーの代わりにシーケンスを使用しています。

関連する問題