A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
例えば、select * from dual where return_negative_slow() > 0 and return_negative_fast() > 0 のような場合、and を右から左に短絡評価してるような気がします。
No.7
- 回答日時:
Oracle ではおっしゃっているように下から上に向かって解析されます。
ただ、それは構文解析のルールであって、実行計画は構文解析が終了した後に、別の方法によって行われます。従って、WHERE 句の記述順を変えたからといって実行計画が変わることはありません。また、10gになって廃止されてしまいましたが、ルールベース・アプローチでは、FROM 句については、後ろから判定される傾向があります。ただし、これは等結合の場合のみで、外部結合があったりするとこの傾向は当てはまらなくなります。
また、ルールベース・アプローチでは、できるだけ索引を使うような実行計画を立てる傾向がありますが、このとき、使える索引が複数あったりすると、後から作成された索引を優先的に使うというようなルールもあります。
ただし、片方が主キー索引で片方が普通の索引であるような場合は、ルールに乗っ取って主キー索引が優先的に使われることに注意してください。
No.6
- 回答日時:
#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;
だと、下から上になります。
なお、ルールベースの場合、複数の索引がある場合に、どれを選択するか迷ったときも
何とも言えない索引選択をしてくれます。(^^; (どうも、索引名の昇順になる傾向)
No.5
- 回答日時:
No.2です。
ちょっと、手元に資料がないのであいまいな回答になりますが。他の方もおっしゃっていますが、現在のバージョンではコストベースとなっており今後はルールベースは廃止される方向です。
で、バージョンなどによりますが、FROM句は下から実行されることが多いです。そのため、軸になるTABLE(データ量が少ないTABLE)を下に書くのが基本とされていたと記憶しています。
しかしながらNO.3の方のとおり実行計画をみるのが一番ではあります。また、現在は、SQLの規格が国際的なやつに完全準拠(SQL98とかなんとか)し、JOIN句の使用を推奨していますので、今後はFROM句の記述順などはあまり有効にはならないとおもいます。
補足ですが、ヒントを使えばなるたけヒントに従います。(つまり実行順序を制御できる)しかしながら、「なるたけ」であって、Oracle君がやっぱこっちのほうがいいや!(コストベース)と判断すればそれまでです。
Oracleの方向性としては、今後こういった「チューニング」ということを極力なくす方向です。したがって、こういった知識も・・・話がそれました。
そういうわけで、要は「実行計画をある程度みよう。でもコストベースなんでOracle君次第だよ。だから統計情報は採ろうね!」とうい考え方でいいんではないでしょうか。
No.4
- 回答日時:
WHEREでの条件判断の順番は、オラクルの都合で、順番が決まります。
記述した順番でも、その逆順でもありません。
一般的プログラム言語の場合、論理演算子と()での優先順位を考慮しつつ
書いた順番に評価していきますが、RDBの場合、WHEREに書かれた要素が
実行計画で、索引の使用する/しないに影響します。
そのため、評価の順番が状況次第で逐次変化します。
たとえば、
select * from emp where to_number(ename)=0 and empno=9999 and to_number(deptno)=0
としたとき、
ワザと数値変換できないフィールドを数値変換しているので、
上から評価しても、下から評価しても、エラーを返すべきですが、
真ん中の要素が、プライマリキーであるため、実行計画で、
索引検索すべしとされました。そのため、真ん中の要素を
一番最初に評価し、そのあと、他の条件を判断することに
なります。今回の場合、索引検索で0件となるので、その他の条件を
判断せず、終了する。(=エラーにはならない)
No.3
- 回答日時:
まず答えとして、条件の実行順序ですが必ずしも記述した順番ではありません。
条件が適用される順番=データを取得してくる順序になりますが、同じSQL文でもOracleの設定(ルールベースかコストベースか)、データの状態、インデックスの有無、等々によって左右されるため、一概にこういう順番になりますということはありません。
これは、Oracleのオプティマイザという機能がSQL文を解析した後に、できるだけ速く結果を返すようにさまざまな情報からデータを取得する順番を決めるからです。(これを実行計画と呼びます。)
そのため、実際にどういう順番で取得してくるかはSQLの実行計画を確認してみないとわかりません。
>下から上だと思った根拠は、WHERE句に条件を2つ記述して、2つともにミスがあった場合、下の条件のミスに対してエラーメッセージが返ってきたためです。
とありますが、これはあくまで構文解析の順番になります。構文解析がOKになってから実行計画が作成され、実行計画を元にデータが取得されるので、エラーの発生順と実行順序は関係ないです。
実行計画について調べてみるとパフォーマンスを考慮したいいSQL文が書ける様になると思います。
No.2
- 回答日時:
下から上というのはFROM句と勘違いされていると思います。
ご回答ありがとうございます。
やはりWHERE句は上から実行されるのですね。下からというのは私の思い違いだったんですね(^^;
FROM句の順序についても全く知らないのですが、FROM句では下から実行されるものなのでしょうか?
FROM句の実行というのが、いまひとつピンとこないのですが、
FROM (SELECT ○○ FROM ×× ・・・) AS TABLE1,
(SELECT △△ FROM □□ ・・・) AS TABLE2
のように、FROM句の中にSELECT文を記述した場合に、下のTABLE2の方から先に実行されるということなのでしょうか?
FROM TABLE1,
TABLE2
のように、SELECT文を記述しない場合には、実行順序は関係あるのでしょうか?(例えば、WHERE句の実行順序に関わってくるとか・・・)
ご教示いただければありがたいです。
No.1
- 回答日時:
上からというか、「左から右へ」が原則です。
下から上というのは、どういう根拠なのでしょうか?
この回答への補足
ご回答ありがとうございます。
例えば、
WHERE 会員番号 = 1234
AND 性別 = '男'
と打ったとすると、
先に会員番号で絞り込んで、さらに性別で絞り込むのか、
それとも性別で絞込んだ後、会員番号で絞り込むのか、ということが知りたいんです。
SQLの記述にミス(列名の間違いや、データ型の不一致など)があった場合、エラーメッセージが帰ってきますよね。
下から上だと思った根拠は、WHERE句に条件を2つ記述して、2つともにミスがあった場合、下の条件のミスに対してエラーメッセージが返ってきたためです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle sqlのwhere句で下記の条件にしたい場合どうなるでしょうか。 システム日付が開始日以上、終了日以 2 2022/03/25 21:22
- Excel(エクセル) [条件付き書式]の設定順の変更は可能か? 4 2022/12/07 10:37
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- Visual Basic(VBA) エクセル VBA 難しいです 1 2023/02/21 15:39
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Excel(エクセル) ワードのマクロについて教えてください。 1 2023/03/11 13:50
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
Viewにインデックスは張れますか?
Oracle
-
SQL、2つのテーブルで条件一致したものだけdeleteする方法は?
Oracle
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
-
4
Excelで数値→文字列変換で指数表示になったものをいっぺんに直したい
Excel(エクセル)
-
5
SQL文のwhere条件文で使う <> の意味はなんですか
その他(データベース)
-
6
SQL*Loaderでのsysdate使用
Oracle
-
7
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
8
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
-
9
SELECTで1件のみ取得するには?
Oracle
-
10
updateで複数行更新したい
Oracle
-
11
sql*loader 数値のロード
Oracle
-
12
Accessでテーブル名やクエリ名一覧の抜き出し
Access(アクセス)
-
13
「RunSQL」と「Execute」の違い
Access(アクセス)
-
14
selectした結果の余計な余白を取るにはどうしたらよいのでしょうか
Oracle
-
15
HTMLからフォルダを開きたい
HTML・CSS
-
16
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
17
Oracleのデータ型、NUMBERについて
その他(データベース)
-
18
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
19
GROUP BYを行った後に結合したい。
Oracle
-
20
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
likeとsubstrの使いわけについて
-
DATE型カラムのインデックスが...
-
SQL ORDER BYにおける条件について
-
キャッシュを使わずにSELECTを...
-
ヒント句が無効になります
-
あいまい検索のパフォーマンス...
-
【チューニング】インデックス...
-
外部結合と等価結合のパフォー...
-
WHERE句の実行順序
-
Like文の速度について教えてく...
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
Statement ignored というエラー
-
エクセルVBAでUserFormを起動し...
-
SQL*Loaderでのsysdate使用
-
今日の日付が入った行のデータ...
-
SQL*Plusの終了はquit?exit?
-
sqlplusでヘッダーが付かない
-
時間項目を60進数から10進数へ...
-
OSのシステム日付を変更して...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
likeとsubstrの使いわけについて
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
Like文の速度について教えてく...
-
WHERE句はJOIN結合前結合後どち...
-
ヒント句が無効になります
-
あいまい検索のパフォーマンス...
-
アナライズでほとんどの処理が...
-
問題解決のストーリーにて PDCA...
-
oracleのanalyzeと処理時間につ...
-
DATE型カラムのインデックスが...
-
JOINの時のONとWHEREの違いにつ...
-
SQL ORDER BYにおける条件について
-
【チューニング】インデックス...
-
INDEX作成による更新系の影響範囲
-
Analyzeとは?
-
Oracleで検索すると、フリーズ...
-
Selectの処理速度改善について
-
PDCAを回すって?
-
前方一致で索引(インデックス...
おすすめ情報