重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

下記の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の方が早いような気がするのですが・・・

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

A 回答 (5件)

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



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

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

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

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

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

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

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

お礼日時:2006/01/19 10:15

まず、インデックスですが、


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

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

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

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

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

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

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

お礼日時:2006/01/19 10:16

処理1のケースでは、ファンクション索引が ”NVL(項目A,'0')"対して存在するなら


索引検索されますが、そうでなければ、全表検索。

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

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

実行計画で比較してみてください。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2006/01/19 10:13

#1のかたへ



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

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

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

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

お礼日時:2006/01/19 10:13

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



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

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

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

間違っていれば、誰かフォローください。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2006/01/19 10:12

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

関連するカテゴリからQ&Aを探す