質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

2713閲覧

Oracle update文のwhere句でバインド配列とin句はどちらが速いのか

jefsnv

総合スコア1

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2020/09/06 06:42

Oracle update文のwhere句でバインド配列とin句はどちらが速いのか

Oracleでバインド変数を使って複数件更新するupdate文を実行する際、
①バインド変数を配列にする
②where句にin句を使用する
どちらが速いのでしょうか?

SQL例

1

1update table1 set item1 = 1 where key1=:key1 and key2=:key2 and key3=:key3;(各keyは3件の配列)(table2でも同じ作り)

2

1update table1 set item1 = 1 where key1=:key1 and key2=:key2 and key3 in (:key31,:key32,:key33); 2update table2 set item1 = 1 where key1=:key1 and (key2,key3) in ((:key21,:key31),(:key22,:key32),(:key23,:key33));

更新条件はテーブルのプライマリーキーで、件数は不定なので、②のin句は動的に作成します。
実際に更新しようとしているテーブルは2種類で、更新条件は
table1はプライマリーキーのうち1項目のみが複数になる。
table2はプライマリーキーのうち複数項目が複数の組み合わせになる。

知りたいこととしては、バインド配列とin句はどちらが速いのか、ですが、
もし、一般的にはバインド配列よりin句の方が速かったとしても、例②(2)のようなSQLの場合はバインド配列の方が速そうな気がします。

調べてみましたがあまり情報が得られず、質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2020/09/06 06:45

調べてみたことには、explainで2つのSQLを比較することも含まれているでしょうか。
jefsnv

2020/09/06 07:22

実行計画ではバインド変数が配列の場合を想定していないものだと思っており、やってみていませんでした。 今環境が手元にないので、簡易的なテーブルを作って試してみました。 コストはどちらも同じで、②in句はor条件に展開されていました。 が、①も実際に実行する時は同様にor条件にようになるのではないかと思ったりします。
guest

回答2

0

ベストアンサー

きちんと統計情報を取得して、実行計画を確認すると共に、何万件単位のデータを用意してPL/SQL などで LOOPさせて処理時間を実測してどちらが早いか判断します。

投稿2020/09/06 06:49

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

in は orに展開されますので、比較しているSQLは同義にはなっていません。

一先ずそれは置いておくとして、バインド変数を配列で与えたとしても結局はDBMSがどのように展開して実行するかですから、実行計画で試すしかないでしょう。

単なる意見ですけど、多分大差はないでしょうから、可読性の高い方で良いかと思いますけどね。

それよりもor条件の使いどころの方がコストに影響を与えるようです。
津島博士のパフォーマンス講座 第52回 OR条件の続きとSQL計画ディレクティブの使用について

投稿2020/09/06 13:07

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問