2009-04-13 8 views
0

Iは、次のUPDATEシナリオを持っている:SETに高価な集約サブクエリが含まれているSQL UPDATE文のパフォーマンスを改善するにはどうすればよいですか?

UPDATE destTable d 
SET d.test_count = (SELECT COUNT(employee_id) 
        FROM sourceTable s 
        WHERE d.matchCode1 = s.matchCode1 AND 
          d.matchCode2 = s.matchCode2 AND 
          d.matchCode3 = s.matchCode3 
        GROUP BY matchCode1, matchCode2, matchCode3, employee_id) 

Iは各反復の一致コードを変更するループでこれを実行しなければなりません。

2つの大きなテーブル(それぞれ〜500kレコード)の間で、このクエリは実行に許容できないほど長い時間がかかります。一度だけ実行すれば、あまり気にしません。それは約20回実行されていることを考えると、私のニーズには余りにも時間がかかる。

2つの完全なテーブルスキャンが必要です(destTable用とサブクエリ用)。

質問:あなたはこれをスピードアップすることをお勧めしますどのような技術

  1. SQLオプティマイザは、サブクエリのwhere節を満たすためにdestTableで更新している行ごとにサブクエリを実行しますか、これを一度に行うためのスーパーインテリジェンスはありますか?

+0

「各繰り返しで一致コードを変更する」とはどういう意味ですか? –

+0

申し訳ありませんが、あいまいです。私は、ロールに基づいて反復するループを持っています。私の例の「マッチコード」は、さまざまな役割の割り当てを表しています。各ループの反復はロールの割り当てを変更して、各パスで同じテーブルの異なるセグメントを更新します(ここでWHOの呪文を忘れてしまいました)。 –

答えて

4
Oracle 9i

と高い:

MERGE 
INTO destTable d 
USING (
     SELECT matchCode1, matchCode2, matchCode3, COUNT(employee_id) AS cnt 
     FROM sourceTable s 
     GROUP BY 
       matchCode1, matchCode2, matchCode3, employee_id 
     ) so 
ON  d.matchCode1 = s.matchCode1 AND 
     d.matchCode2 = s.matchCode2 AND 
     d.matchCode3 = s.matchCode3 
WHEN MATCHED THEN 
UPDATE 
SET  d.test_count = cnt 

あなたはdestTable(matchCode1, matchCode2, matchCode3)上の複合インデックス、およびsourceTable

+0

残念ながら、 'Explain Plan'アナライザは、マージが単純な更新文に比べてコストがかかります。 –

+0

計画の予測コストが高くなったからといって実際にはもっと時間がかかることはありません。それを実際に実行してみてください。 –

+0

最初のクエリでは、実際にネストされたループと同様の実行計画が強制されます。私の質問では、オプティマイザは、選択するアルゴリズムの全範囲を持っています。 – Quassnoi

0

あなたはUPDATE FROMクエリを考えましたか?

+0

どう違うのですか(私の無知を言い訳しますか?)それはOracleで動作しますか? –

+0

OracleはUPDATE FROMをサポートしていません。サブクエリは更新できますが、この特定のものは更新可能ではありません(キーは保持されません) – Quassnoi

3

私が持っているで(matchCode1, matchCode2, matchCode3, employee_id)上の複合インデックスを持っていることを確認し、クエリをスピードアップするために、これをループで実行する

最初のあなたがすることは、サブクエリまたはwhere句にループを構築することです。データを更新していて、更新したばかりのデータの一部をすぐに置き換えています。現在の反復に適したレコードのみを変更するように更新をフィルタリングするか、クエリを複雑にして1つのステートメント(おそらく両方)のすべてを更新できるようにする必要があります。

+0

大規模な要約テーブルのセクションを更新しています。ループを繰り返すたびに、大きな集計テーブルのセクションが更新されます。 –

+0

サンプルにwhere句は表示されません。したがって、たとえ同じ値で終了しても、各更新がテーブル内のすべてのレコードをヒットすることがわかります。 –

+0

従業員の役割割り当てを要約しています。それぞれの役割は、質問で指定された3-4の値の一致を考慮して、割り当ての数を報告する必要があります。 –

関連する問題