すいません、まだはじめたばかりで全然良くわからないのですが、
維持管理でこの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にインデックスがあります
ちょっと事情があって、大きくやり方を変えられないので、エージェントのジョブ内でもっと早くできる方法が知りたいです。
なにとぞ、よろしくお願いいたします。
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_cou …
いずれにしろ、実行計画を取ってみて効率のよい書き方を探してください。
お礼おそくなりすいません。
教えていただいたやり方にて劇的に早くなりました。
他所にも同じようなやり方をしている部分がありましたので
いっきに修正しました。
ちょっとしたことですごくかわるんですね。勉強になりました。
ありがとうございました。
No.1
- 回答日時:
こんにちは!
SQL Serverについては素人なのですが、とりあえず
・更新表TABLE_Aをクエリに使っている(リソースを消費しそう)
・大量件数のNOT INを使っている(オプティマイザによりますがNOT EXISTSの方が)
が気になります。
(1)ワーク表にSELECT A+B+C FROM TABLE_Aの結果を入れる
(2)INSERT文の条件を、ワーク表をNOT EXISTSで評価するように書き換える
(3)ワーク表を消す
で改善されないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- 仕事術・業務効率化 スローライフって、どう思いますか? 1 2022/11/07 03:31
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
oracleのanalyzeと処理時間につ...
-
あいまい検索のパフォーマンス...
-
WHERE句の実行順序
-
Like文の速度について教えてく...
-
Accessのマクロでモジュールを...
-
エクセルVBAでUserFormを起動し...
-
OutlookVBAで作成したマクロに...
-
今日の日付が入った行のデータ...
-
Access VBAで行ラベルが定義さ...
-
Texの枠囲み調節
-
DB2でのシステム日付のinsert、...
-
PL/SQLカーソルの2重FORループ...
-
ODBCリンクの際にACCESSでは読...
-
Excelグラフの日付軸の日付がず...
-
callで順に実行されるプロシー...
-
sqlplusでヘッダーが付かない
-
PL/SQLでSPOOLさせたいのですが...
-
【Excel VBA】 WorksheetやRa...
-
PL/SQLのエラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
likeとsubstrの使いわけについて
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
Like文の速度について教えてく...
-
ヒント句が無効になります
-
WHERE句はJOIN結合前結合後どち...
-
あいまい検索のパフォーマンス...
-
アナライズでほとんどの処理が...
-
問題解決のストーリーにて PDCA...
-
oracleのanalyzeと処理時間につ...
-
DATE型カラムのインデックスが...
-
JOINの時のONとWHEREの違いにつ...
-
SQL ORDER BYにおける条件について
-
【チューニング】インデックス...
-
INDEX作成による更新系の影響範囲
-
Analyzeとは?
-
Oracleで検索すると、フリーズ...
-
Selectの処理速度改善について
-
PDCAを回すって?
-
前方一致で索引(インデックス...
おすすめ情報