2011-12-16 14 views
0

からレコードを挿入する際に、レコードをコミットすると、私がしている:は、SQLクエリは次のように我々は他のテーブル

insert into dedupunclear 
    select mdnnumber,poivalue 
    from deduporiginal a 
    where exists (
    select 1 
    from deduporiginal 
    where mdnnumber=a.mdnnumber and rowid<a.rowid) 
    or mdnnumber is null; 

私deduporiginalで500Kの記録があります。私は関数内にこのクエリを入れましたが、それはdedupunclearテーブルにレコードをコミットするために約3時間かかります。

パフォーマンス上の問題を解決する方法はありますか?

このクエリがレコードをコミットすると、ある間隔で、またはselectクエリからすべての結果を取得した後で、

+0

すでにコミットされている部分的な結果からデータをクリーンアップすることはどれくらい難しいでしょうか? – Thilo

+0

@chetan - クエリプランを投稿できますか?テーブルの統計は正確ですか? 'mdnnumber'カラムにインデックスがありますか?そのクエリを実行するために3時間近くかかることはありません(または、重複行を削除する単一の 'DELETE'文を実行する必要があります)。だから私はあなたの統計が誤解を招いていることを意味する恐ろしい計画があると思われる傾向があります。 –

+0

それは私のせいでした。他の重いOracleプロセスがサーバーにロードされました。クエリが完璧であるか、それとも何か別の選択肢がありますか? – chetan

答えて

1

これは私が他の日にそれをやった方法です:

delete from table a 
    where rowid > 
      (select min(rowid) from table b 
       where nvl(a.id, 'x') = nvl(b.id, 'x') ) 

代わりに重複排除テーブルへの挿入のため、私は、ステージングテーブルから直接行を削除しました。 100万行のテーブルの場合、このクエリはかなりうまく機能しました。私は、nvl関数がインデックスを削除すると心配しましたが、十分にうまくいきました。

関連する問題