-1

クエリとパフォーマンスを記述する最良の方法について、職場の何人かの男と話し合っているだけです。

最初のテーブルからのすべての結合で結合する行が少なくなるように、最初の結果セットを制限する方がよいでしょうか?

例えば:

表: REFCODE には最大 10,000 行あります

表: WHSE には最大 200 行あります

性能的にはどっちがいい?

内部結合を使用して、大きな結果セットから行を絞り出します。

SELECT
  *
FROM
  REFCODE
INNER JOIN
  WHSE ON
  WHSE.RCIDX = REFCODE.RCIDX

小さい方の結果セットを最初に使用する:

SELECT
  *
FROM
  WHSE
INNER JOIN
  REFCODE ON
  REFCODE.RCIDX = WHSE.RCIDX

最大の結果セットを使用しますが、where 句を使用して、2 番目のテーブルに結合することがわかっているレコードのみをフィルター処理します

SELECT
  *
FROM
  REFCODE
INNER JOIN
  WHSE ON
  WHSE.RCIDX = REFCODE.RCIDX
WHERE
  REFCODE.TYPE = 'WHSE'

それとも、CBO は同様の説明計画を決定しますか? 職場の人から、常に可能な限り最小の結果セットから始めるように言われましたが、よくわかりません!

どんな議論も感謝します!

4

1 に答える 1

3

あなたが投稿したような単純なケースの場合、オプティマイザーはほぼ確実に 3 つのクエリすべてに対して同じクエリ プランを生成します。性能に違いはありません。

一般に、クエリ内のテーブルの順序は関係ありません。オプティマイザは、オブジェクトについて収集した統計に基づいて、適切な結合順序と結合方法を判断する必要があります。場合によっては、比較的多数のテーブルを結合する場合、オプティマイザが考えられるすべての結合順序を考慮することができないことがあります。optimizer_max_permutations設定。その場合、オプティマイザーはヒューリスティックを使用して、どのパスを詳細に検討し、どのパスを無視するかを決定しようとします。これらのヒューリスティックは不完全であるため、オプティマイザーがより良い結合順序につながるパスを除外する場合があることに気付くかもしれません。最も制限の厳しいテーブルを最初にリストすると、最も効率的である可能性が高い駆動テーブルである計画に偏りが生じる可能性があります。しかし、それは非常にまれなケースです。

Jonathan Lewis は、内のテーブルの順序がFROMクエリ プランにどのように影響するかについての優れた記事を書いています。しかし、作成するクエリや遭遇するクエリの大部分では、テーブルの順序は関係ありません。

Oracle 7.3.4 がピカピカで新しく、恐竜が地球を歩き回っていた古いルールベースのオプティマイザーの時代に戻ると、ルールベースのオプティマイザーはテーブルの順序を使用して計画を生成していました。あなたが話している人々は、当時存在していたのに十分な年齢であるか、それらの古い開発者から教えられたルールを継承していることに賭けます.

(ほぼすべての場合) パフォーマンス上の利点はなくなりましたが、クエリを構造化するための一貫したアプローチは有益な場合があります。たとえば、先頭のテーブルを常に最初に配置すると、開発者は予想されるクエリ プランについて考え、コードをもう少し慎重に書くようになる可能性があります。また、オプティマイザーがクエリ プランを生成するときに期待どおりに動作しているかどうかを比較的迅速に確認して、オブジェクトに関する統計に関する問題の手がかりを得ることができます。

于 2013-07-19T03:45:48.927 に答える