- PR -

結合条件を含んだ大量データの削除方法

1
投稿者投稿内容
hs25186
会議室デビュー日: 2005/08/01
投稿数: 5
投稿日時: 2005-11-11 09:14
Oracle9iで使用するSQLについて質問です。

「テーブルAで条件1に該当するレコードと結びつく、テーブルBのレコード」(テーブルA,Bは、カラム1とカラム2で結合)
を1回のDelete文で消したい場合、以下のようにIN句を使う方法があるかと思いますが、

delete from テーブルB where (カラム1,カラム2) in
(select カラム1,カラム2 from テーブルA where 条件1)

テーブルAの抽出件数が大量(数千件)であった場合、パフォーマンス的に良い結果が得られません。
(確か、IN句の上限(1000件?)もあった気がします)

他にも方法はございますでしょうか?
ご存知の方、宜しくお願い致します。
No鶴瓶 NoLife
常連さん
会議室デビュー日: 2005/01/28
投稿数: 48
投稿日時: 2005-11-11 09:46
EXISTSを使うのはどうでしょうか?
要件は満たすと思います。
※ただし、パフォーマンスが向上されるか
 どうかは不明ですが(^^;

以下はOracleのマニュアルの抜粋です。

【EXISTS】
副問合せによって行が1 行以上
戻される場合には、TRUE と評
価されます。

SELECT
department_id
FROM
departments d
WHERE EXISTS
(SELECT * FROM employees e
WHERE d.department_id = e.department_id);
hs25186
会議室デビュー日: 2005/08/01
投稿数: 5
投稿日時: 2005-11-11 10:12
早速のご回答、ありがとうございました。

教えて頂いた方法で試したところ、
IN句の場合53秒だった時間が、EXISTS句を用いることで19秒に短縮されました。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-11-11 10:18
EXISTS句の方が IN句を使うより効率的だと思います。
でも数千件のデータで、普通そんなにパフォーマンスに影響が出るかな〜?
インデックスが張られていないとか?

[ メッセージ編集済み 編集者: Desmo 編集日時 2005-11-11 10:21 ]
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-11-11 10:34
delete from テーブルB where (カラム1,カラム2) in
(select カラム1,カラム2 from テーブルA where 条件1
intersect select カラム1,カラム2 from テーブルB);

相関サブクエリを使わない
こんな方法もありますが速度的に速いかは不明(インデックスの張り方などによります)


OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2005-11-11 11:34
データ件数等により IN がよいか EXISTS がよいかを一般的に述べることはできませんが、
EXISTS の場合、存在チェックだけで済む分だけ検索が高速になることは事実ですね。
1

スキルアップ/キャリアアップ(JOB@IT)