• ベストアンサー

エージェントのジョブの遅さ

すいません、まだはじめたばかりで全然良くわからないのですが、 維持管理でこの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にインデックスがあります ちょっと事情があって、大きくやり方を変えられないので、エージェントのジョブ内でもっと早くできる方法が知りたいです。 なにとぞ、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.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_count_asc=20 いずれにしろ、実行計画を取ってみて効率のよい書き方を探してください。

pontamana
質問者

お礼

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

その他の回答 (1)

  • trinker
  • ベストアンサー率73% (14/19)
回答No.1

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

pontamana
質問者

お礼

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