dポイントプレゼントキャンペーン実施中!

すいません、まだはじめたばかりで全然良くわからないのですが、
維持管理でこのSQL文で処理速度の遅さにひっかかっています。
自分で作ったものではないのでいまいちよくわかってないのですが、
エージェントのジョブで1日3回行っている処理、同じ件数(インデックスがまったく一緒)になるよう、INSERTをかける処理なのですが、

INSERT INTO TABLE_A
SELECT
AAA,
BBB,
CCC,
0,
0
FROM TABLE_B
WHERE A + B + C NOT IN (SELECT A + B + C FROM TABLE_A)

というようなTRANSACT SQLになっています。
TABLE_AにないものをTABLE_Bから持ってくるということだと思います。
件数は約13万件、なぜか1時間かかるようで、他の処理のレスポンスに影響が出てきています。
根本的にこういうやり方はまずいのでしょうか?処理を遅くする要因があるのでしょうか?
もしあるようなら改善策を教えていただけると助かります。

環境はSQL SERVER 2005です。
どちらもA,B,Cにインデックスがあります
ちょっと事情があって、大きくやり方を変えられないので、エージェントのジョブ内でもっと早くできる方法が知りたいです。

なにとぞ、よろしくお願いいたします。

A 回答 (2件)

まず、確認として、エージェント経由とManagementStudio経由で


レスポンスの違いはないでしょうか。

違いがなければSQLの問題です。

> WHERE A + B + C NOT IN (SELECT A + B + C FROM TABLE_A)
Where条件に式を入れると索引を使いません。
ManagementStudioで、実行計画を表示させてみましょう。おそらく索引を使っていないと思います。

せめて、こう書きましょう。片側のテーブルの索引は使ってくれるかもしれません。
WHERE (A,B,C) NOT IN (SELECT A,B,C FROM TABLE_A)

あとは、not existsで以下に書き換えるか。
INSERT INTO TABLE_A
SELECT
AAA,
BBB,
CCC,
0,
0
FROM TABLE_B
WHERE not exists
(select 'X' FROM TABLE_A
where ABLE_A.A = ABLE_B.A
and ABLE_A.B = ABLE_B.B
and ABLE_A.C = ABLE_B.C
);

not inには以下の問題があるので、私はnot existsを使ってます。
http://oshiete1.goo.ne.jp/qa5419099.html?ans_cou …

いずれにしろ、実行計画を取ってみて効率のよい書き方を探してください。
    • good
    • 0
この回答へのお礼

お礼おそくなりすいません。
教えていただいたやり方にて劇的に早くなりました。
他所にも同じようなやり方をしている部分がありましたので
いっきに修正しました。
ちょっとしたことですごくかわるんですね。勉強になりました。

ありがとうございました。

お礼日時:2010/01/18 16:00

こんにちは!


SQL Serverについては素人なのですが、とりあえず
・更新表TABLE_Aをクエリに使っている(リソースを消費しそう)
・大量件数のNOT INを使っている(オプティマイザによりますがNOT EXISTSの方が)
が気になります。
(1)ワーク表にSELECT A+B+C FROM TABLE_Aの結果を入れる
(2)INSERT文の条件を、ワーク表をNOT EXISTSで評価するように書き換える
(3)ワーク表を消す
で改善されないでしょうか。
    • good
    • 0
この回答へのお礼

お礼おそくなりすいません。
無事、解決いたしました。
ありがとうございました。

お礼日時:2010/01/18 16:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!