こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

処理速度について(UPDATE)

下記の2つのSQL句があります。
どのSQLが処理速度が速いのでしょうか。
また、一般的なのはどのSQLなのでしょうか。

処理1
UPDATE テーブルA
SET 項目A = '0'
WHERE NVL(項目A,'0') = '0';

処理2
UPDATE テーブルA
SET 項目A = '0'
WHERE 項目A IS NULL;

私としては、処理2の方が早いような気がするのですが・・・

教えてください。お願いします。

投稿日時 - 2006-01-18 16:26:30

QNo.1904751

暇なときに回答ください

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

歴然とした差はないでしょうが、NVL(項目A,'0') に関数インデックスが張られていない限り、処理2の方が高速になるでしょう。

まず、処理1も処理2も全表走査になりますので、実行計画には差がありません。

解析時間については、NVL(項目A,'0') に関数インデックスが存在するかどうかを調査する時間を考慮すると処理2の方が速いかもしれません。(ミリ秒レベルの差もあるかどうかは分かりませんが)

次に、更新量ですが、処理1の場合、項目Aが NULL の場合だけでなく、'0' の場合も更新対象になってしまうため、項目Aが '0' であるレコードが多い場合は若干遅くなるかもしれません。(これはミリ秒の世界でしょうが)

さらに、処理1の場合は、項目Aの全ての行に対して NVL 関数を適用しなければならないのに対して、処理2では、単純に項目Aが NULL であるかどうかを比較するだけで済んでしまいます。(これもミリ秒の世界でしょうが)

投稿日時 - 2006-01-18 20:38:52

お礼

回答、ありがとうございます。

処理2の方が効率的ですが、その差はわずかしかない
という事がわかりました。

更新量はそんなにない(せいぜい10万件)ので、
他のPGMと同じように処理1で作業を進めたいと思います。

投稿日時 - 2006-01-19 10:15:54

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

まず、インデックスですが、
テーブルAの項目Aにインデックスがはってあっても、
この両SQLともインデックスは使用されません。
ですので、処理レコード数が
そんなに多くない場合はたいして処理速度は変わらないです。

また、
「WHERE NVL(項目A,'0') = '0'」  と
「WHERE 項目A IS NULL」
の速度を比較する指標値というのは存在しません。

本当にどちらが早いかを知るには、
実際にデータを用意しスクリプトをかまして時間を測定するのが
手っ取り早いです。

数千万件のデータを用意して試すと
少しは違いが出てくるかと思います。
(何ミリ秒程度の違いだと思いますが)

投稿日時 - 2006-01-19 08:56:06

お礼

回答、ありがとうございます。

処理2の方が効率的ですが、その差はわずかしかない
という事がわかりました。

更新量はそんなにない(せいぜい10万件)ので、
他のPGMと同じように処理1で作業を進めたいと思います。
(レスポンスにシビアではない業種なので(笑))

投稿日時 - 2006-01-19 10:16:53

処理1のケースでは、ファンクション索引が ”NVL(項目A,'0')"対して存在するなら
索引検索されますが、そうでなければ、全表検索。

処理2は、たぶん全表検索。

結局、全表検索同士であるなら、nvl関数の微妙なオーバーヘッドだけの
違いでしかないように思います。

実行計画で比較してみてください。

投稿日時 - 2006-01-18 18:34:09

お礼

回答、ありがとうございます。

処理2の方が効率的ですが、その差はわずかしかない
という事がわかりました。

他のPGMを見るとこのシステムでは処理1を使っているので、
この方法で作業を進めたいと思います。

投稿日時 - 2006-01-19 10:13:57

ANo.2

#1のかたへ

null 及び 左辺に関数を用いている場合、一切の索引は適用されません。
この場合、実データ件数にもよりますので、実行計画を取得されて検討するのが一番と思います。

投稿日時 - 2006-01-18 17:05:17

お礼

回答、ありがとうございます。

処理2の方が効率的ですが、その差はわずかしかない
という事がわかりました。

他のPGMを見るとこのシステムでは処理1を使っているので、
この方法で作業を進めたいと思います。

投稿日時 - 2006-01-19 10:13:08

ANo.1

処理2の方が私も効率よく処理が出来ると思います。

処理1では、項目Aをnull と 0の場合nvlで変換している為、通常のインデックスを使用しないと思います。
(インデックスでNVL(項目A,'0') を作成していれば使えると思います。)

処理2では is null を使用しているので、null項目をインデックスから取得していると思いますので、こちらが効率的だと思います。

また、更新件数も変わってきます。
(処理1の方が更新件数多)

間違っていれば、誰かフォローください。

投稿日時 - 2006-01-18 16:53:25

お礼

回答、ありがとうございます。

処理2の方が効率的ですが、その差はわずかしかない
という事がわかりました。

他のPGMを見るとこのシステムでは処理1を使っているので、
この方法で作業を進めたいと思います。

投稿日時 - 2006-01-19 10:12:45