- PR -

WHERE句の右辺と左辺

投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2004-12-16 09:43
お世話になります。

例えば、テーブルAには10件、テーブルBには1000000件のレコードがある場合

SELECT * FROM A,B WHERE A.CODE_1=B.CODE_1 AND A.CODE_2=B.CODE_2 AND A.CODE_3=B.CODE_3



SELECT * FROM A,B WHERE B.CODE_1=A.CODE_1 AND B.CODE_2=A.CODE_2 AND B.CODE_3=A.CODE_3

では実行時間に差はでるのでしょうか?
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-12-16 10:09
私の使用しているデータベース製品 X では、実行時間に差はありません。(明示的に指定しない限り同じ実行プランになります。)
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2004-12-16 10:12
WHERE句では違いは無いと思います。
FROM句にはデータ件数が多いテーブルから記述していくと良かったと記憶してます。
理由については...時間が出来たら調べてきますです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-12-16 12:23
引用:

いーたさんの書き込み (2004-12-16 10:12) より:
WHERE句では違いは無いと思います。
FROM句にはデータ件数が多いテーブルから記述していくと良かったと記憶してます。
理由については...時間が出来たら調べてきますです。


RDBMSにもよりますが、通常はFROM句の順番で実行プランが変わることはありません。
Sybase ASEやSQLServerでは、set forceplan onでFROM句の順番で絞込みを行うように
実行プランを強制することができますが、デフォルトではFROM句の順番には影響されません。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2004-12-16 13:02
FROM 句や WHERE 句の順番で実行計画が変化するのは Oracle のルールベースオプティマイザを使用したときだけだと思います (ヒントを使用した場合を除く)。

最近は Oracle でも他のデータベースと同様、コストベースオプティマイザのみのサポート (10g) となっているので、FROM 句は WHERE 句の順番も実行計画に影響を与えないでしょう。

ただ、例え Oracle のルールベースオプティマイザであっても、等号の左辺と右辺の入れ替えは実行計画には影響しないと思います。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-12-16 14:31
引用:

あんとれさんの書き込み (2004-12-16 13:02) より:
FROM 句や WHERE 句の順番で実行計画が変化するのは Oracle のルールベースオプティマイザを使用したときだけだと思います (ヒントを使用した場合を除く)。



正確には、
Oracleではオプティマイザモードに関わらず、FROM 句や WHERE 句の順番で実行計画が
変化することはありません(複数の候補が同一順位だったり同一コストの場合を除く)。
です。
マニュアルのオプティマイザの説明のところに明記されています。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-12-16 14:50
SQLチューニングの必須知識を総ざらい(後編)という @IT の記事に FROM句の指定順番が後ろの表が外部表となります。 という記述がありました。

Oracle を使わなくなって久しい私には、どちらが正しいのか判断できませんが、とりあえず。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-12-16 15:01
引用:

未記入さんの書き込み (2004-12-16 14:50) より:
SQLチューニングの必須知識を総ざらい(後編)という @IT の記事に FROM句の指定順番が後ろの表が外部表となります。 という記述がありました。


該当の記事は、カーニーさんの投稿の「(複数の候補が同一順位だったり同一コストの場合を
除く)」に当てはまると思うので、どちらも正しいのではないかと。
#コストベースでまったくコストが同じ、と判断される場合はめったにないでしょうけど

スキルアップ/キャリアアップ(JOB@IT)