
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
-
データを削除しても表領域の使用率が減りません
Oracle
-
キャッシュを使わずにSELECTを投げたい
Oracle
-
-
4
異なるスキーマからデータを抽出するには?oracl、PL/SQL
Oracle
-
5
「後継」の反意語は「前継」ですか?
日本語
-
6
プライマリーキーの昇順でソートにならないのは?
MySQL
-
7
SELECT 文 GROUP での1件目を取得
SQL Server
-
8
単一グループのグループ関数ではありません。
Oracle
-
9
SELECTで1件のみ取得するには?
Oracle
-
10
Oracleの排他制御について教えてください
その他(データベース)
-
11
getStringの値がNULLの時の処理
Java
-
12
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
13
selectの単純繰り返し
Oracle
-
14
実行計画の「COST」と「BYTE」について教えていただきたいです。
Oracle
-
15
はじめまして!
Oracle
-
16
変数が選択リストにありません
Oracle
-
17
【PL/SQL】FROM区に変数を使う方法
Oracle
-
18
SQLPLUSで結果を画面に表示しない
Oracle
-
19
カーソル0件の時にエラーを発生させる
Oracle
-
20
select句副問い合わせ 値の個数が多すぎます
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Selectの処理速度改善について
-
データ抽出の速度について
-
Oracle 実行計画、統計情報の見方
-
アナライズでほとんどの処理が...
-
【チューニング】インデックス...
-
処理速度の改善について
-
Analyzeとは?
-
PDCAを回すって?
-
エクセルVBAでUserFormを起動し...
-
Accessのマクロでモジュールを...
-
roleの権限確認方法
-
Oracle8iで順序の値のリセット
-
SQLで部分的にGROUP BYしたいとき
-
wordの差し込み印刷での日付表示
-
SQLserver算術オーバーフロ...
-
Excelのピボットテーブルで数も...
-
TO_DATEの使い方を教えて下さい
-
イベントプロシージャが動作しない
-
PL/SQLで、期間計算
-
(日付 - 日付)/数値
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
likeとsubstrの使いわけについて
-
Like文の速度について教えてく...
-
ヒント句が無効になります
-
WHERE句はJOIN結合前結合後どち...
-
問題解決のストーリーにて PDCA...
-
SQL ORDER BYにおける条件について
-
あいまい検索のパフォーマンス...
-
oracleのanalyzeと処理時間につ...
-
外部結合と等価結合のパフォー...
-
アナライズでほとんどの処理が...
-
実行計画HASH JOIN RIGHT OUTER
-
OEMで負荷の少ないSQLの実行計...
-
データ抽出の速度について
-
Oracleで検索すると、フリーズ...
-
PDCAを回すって?
-
INDEX作成による更新系の影響範囲
-
800万件のテーブル読み込み...
-
Analyzeとは?
おすすめ情報