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

締切り済みの質問

WHERE句の実行順序

SELECT文などで、
 WHERE 条件1
 AND  条件2
と記述した場合、実行順序は上から(条件1⇒条件2)になるのでしょうか?それとも逆なのでしょうか?
同じ職場の方は、上からだとおっしゃるのですが、実行してみると下からのような気がするのですが・・・。私の気のせいでしょうか?

投稿日時 - 2005-10-15 23:47:30

QNo.1716686

暇なときに回答ください

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

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

回答(8)

ANo.8

jmh

例えば、select * from dual where return_negative_slow() > 0 and return_negative_fast() > 0 のような場合、and を右から左に短絡評価してるような気がします。

投稿日時 - 2005-10-22 13:22:12

ANo.7

Oracle ではおっしゃっているように下から上に向かって解析されます。ただ、それは構文解析のルールであって、実行計画は構文解析が終了した後に、別の方法によって行われます。従って、WHERE 句の記述順を変えたからといって実行計画が変わることはありません。

また、10gになって廃止されてしまいましたが、ルールベース・アプローチでは、FROM 句については、後ろから判定される傾向があります。ただし、これは等結合の場合のみで、外部結合があったりするとこの傾向は当てはまらなくなります。

また、ルールベース・アプローチでは、できるだけ索引を使うような実行計画を立てる傾向がありますが、このとき、使える索引が複数あったりすると、後から作成された索引を優先的に使うというようなルールもあります。

ただし、片方が主キー索引で片方が普通の索引であるような場合は、ルールに乗っ取って主キー索引が優先的に使われることに注意してください。

投稿日時 - 2005-10-17 15:02:18

#4です。

念のため書いておきますが..

ルールベースだから、FROMに書いた表を、必ず下から上に向かって、検索するというのは
間違いです。
ルールベースとコストベースで、実行計画を立てるための、決定要素は異なりますが、
ルールベースであっても、上から下へ検索するようなプランは作ります。

例えば、ルールベースオプティマイザで、次のSQLは

select * from emp,dept
where empno between 1 and 9999 and loc='DALLAS' and emp.deptno=dept.deptno

emp表->dept表の順番になります。(ルール上、empの索引検索と判断したから)

ルールベースで、よく”下から上に”と言われるのは、ルール上決定しきれない場合に、
そのような適当な判断をするからです。(=判断に窮すると、下から上に・・)

例えば、
select * from emp,dept where emp.deptno=dept.deptno;
だと、下から上になります。

なお、ルールベースの場合、複数の索引がある場合に、どれを選択するか迷ったときも
何とも言えない索引選択をしてくれます。(^^; (どうも、索引名の昇順になる傾向)

投稿日時 - 2005-10-16 04:03:18

ANo.5

No.2です。ちょっと、手元に資料がないのであいまいな回答になりますが。

他の方もおっしゃっていますが、現在のバージョンではコストベースとなっており今後はルールベースは廃止される方向です。
で、バージョンなどによりますが、FROM句は下から実行されることが多いです。そのため、軸になるTABLE(データ量が少ないTABLE)を下に書くのが基本とされていたと記憶しています。

しかしながらNO.3の方のとおり実行計画をみるのが一番ではあります。また、現在は、SQLの規格が国際的なやつに完全準拠(SQL98とかなんとか)し、JOIN句の使用を推奨していますので、今後はFROM句の記述順などはあまり有効にはならないとおもいます。

補足ですが、ヒントを使えばなるたけヒントに従います。(つまり実行順序を制御できる)しかしながら、「なるたけ」であって、Oracle君がやっぱこっちのほうがいいや!(コストベース)と判断すればそれまでです。

Oracleの方向性としては、今後こういった「チューニング」ということを極力なくす方向です。したがって、こういった知識も・・・話がそれました。

そういうわけで、要は「実行計画をある程度みよう。でもコストベースなんでOracle君次第だよ。だから統計情報は採ろうね!」とうい考え方でいいんではないでしょうか。

投稿日時 - 2005-10-16 02:50:47

WHEREでの条件判断の順番は、オラクルの都合で、順番が決まります。
記述した順番でも、その逆順でもありません。

一般的プログラム言語の場合、論理演算子と()での優先順位を考慮しつつ
書いた順番に評価していきますが、RDBの場合、WHEREに書かれた要素が
実行計画で、索引の使用する/しないに影響します。
そのため、評価の順番が状況次第で逐次変化します。


たとえば、
select * from emp where to_number(ename)=0 and empno=9999 and to_number(deptno)=0
としたとき、

ワザと数値変換できないフィールドを数値変換しているので、
上から評価しても、下から評価しても、エラーを返すべきですが、
真ん中の要素が、プライマリキーであるため、実行計画で、
索引検索すべしとされました。そのため、真ん中の要素を
一番最初に評価し、そのあと、他の条件を判断することに
なります。今回の場合、索引検索で0件となるので、その他の条件を
判断せず、終了する。(=エラーにはならない)

投稿日時 - 2005-10-16 02:10:12

ANo.3

まず答えとして、条件の実行順序ですが必ずしも記述した順番ではありません。

条件が適用される順番=データを取得してくる順序になりますが、同じSQL文でもOracleの設定(ルールベースかコストベースか)、データの状態、インデックスの有無、等々によって左右されるため、一概にこういう順番になりますということはありません。

これは、Oracleのオプティマイザという機能がSQL文を解析した後に、できるだけ速く結果を返すようにさまざまな情報からデータを取得する順番を決めるからです。(これを実行計画と呼びます。)
そのため、実際にどういう順番で取得してくるかはSQLの実行計画を確認してみないとわかりません。

>下から上だと思った根拠は、WHERE句に条件を2つ記述して、2つともにミスがあった場合、下の条件のミスに対してエラーメッセージが返ってきたためです。

とありますが、これはあくまで構文解析の順番になります。構文解析がOKになってから実行計画が作成され、実行計画を元にデータが取得されるので、エラーの発生順と実行順序は関係ないです。

実行計画について調べてみるとパフォーマンスを考慮したいいSQL文が書ける様になると思います。

投稿日時 - 2005-10-16 02:01:22

ANo.2

下から上というのはFROM句と勘違いされていると思います。

投稿日時 - 2005-10-15 23:55:03

お礼

ご回答ありがとうございます。
やはりWHERE句は上から実行されるのですね。下からというのは私の思い違いだったんですね(^^;

FROM句の順序についても全く知らないのですが、FROM句では下から実行されるものなのでしょうか?
FROM句の実行というのが、いまひとつピンとこないのですが、
FROM (SELECT ○○ FROM ×× ・・・) AS TABLE1,
   (SELECT △△ FROM □□ ・・・) AS TABLE2
のように、FROM句の中にSELECT文を記述した場合に、下のTABLE2の方から先に実行されるということなのでしょうか?

FROM TABLE1,
   TABLE2
のように、SELECT文を記述しない場合には、実行順序は関係あるのでしょうか?(例えば、WHERE句の実行順序に関わってくるとか・・・)

ご教示いただければありがたいです。

投稿日時 - 2005-10-16 01:53:41

ANo.1

上からというか、「左から右へ」が原則です。
下から上というのは、どういう根拠なのでしょうか?

投稿日時 - 2005-10-15 23:50:44

補足

ご回答ありがとうございます。
例えば、
 WHERE 会員番号 = 1234
 AND  性別 = '男'
と打ったとすると、
先に会員番号で絞り込んで、さらに性別で絞り込むのか、
それとも性別で絞込んだ後、会員番号で絞り込むのか、ということが知りたいんです。

SQLの記述にミス(列名の間違いや、データ型の不一致など)があった場合、エラーメッセージが帰ってきますよね。
下から上だと思った根拠は、WHERE句に条件を2つ記述して、2つともにミスがあった場合、下の条件のミスに対してエラーメッセージが返ってきたためです。

投稿日時 - 2005-10-16 01:18:10

あなたにオススメの質問