2016-11-03 11 views
1

を変更:のOracle実行計画私は、クエリを持って

   SELECT COUNT(1) 
      FROM registration r, 
        proxy p 
      WHERE r.participant_code = p.participant_code 
       AND r.proxy_type = p.proxy_type 
       AND r.proxy_value = p.proxy_value 
       AND r.proxy_sequence= p.proxy_sequence 

で使用されるすべての4つのフィールドがテーブルの結合条件を「プロキシ」 'プロキシのプライマリキーです。クエリの実行計画はプライマリキーを使用してスキャンを行っていますが、一瞬して突然フルテーブルスキャンでインデックススキャンを変更しました。

そのクエリが変更された後に少し( 'r.proxy_value = p.proxy_value' およびスワップ 'r.proxy_type = p.proxy_type' を接合する):

   SELECT COUNT(1) 
      FROM registration r, 
        proxy p 
      WHERE r.participant_code = p.participant_code 
       AND r.proxy_value = p.proxy_value     
       AND r.proxy_type = p.proxy_type 
       AND r.proxy_sequence= p.proxy_sequence 

実際両方のクエリは同等です。ただし、この変更後、2回目のクエリの実行計画では、フルスキャンではなくインデックススキャンが使用されます。

今、私は非常に具体的な質問があります。

Oracleは2番目のクエリを再コンパイルし、それが実行計画の変更を照会するためにつながりますか?

+0

2つのクエリは、WHERE句内の条件の順序を除いて、等価/同等です。直感的には同じだと思うかもしれませんが、私はそれらを同一にして再テストします(はい、私はこの継ぎ目が非常にアマチュアのようなコメントになることに同意しますが、私は人生で何度も驚いていましたこの種のもの)。 – FDavidov

+0

実際に私はこのシナリオをテストしたことを知っています(はい、動作が変更されました。また、Oracleの実行計画管理メカニズムを制御できないため、再テストするのは非常に難しいことに注意してください)。オラクルはこの状況を処理します。 Oracleのマニュアルに関するすべてのご意見をお待ちしております。 – mvb13

+0

私はあなたを得るか分からない。どちらも同じものを選択するようにしましたか( 'WHERE'節の条件の順序を変更することによって)?はいの場合、あなたはそれらのために異なる実行計画を観察しましたか? – FDavidov

答えて

2

オラクルでは、データウェアハウスのシナリオでは予測性は向上しましたが、従来のルールベースオプティマイザと比較して、デフォルトでコストベースオプティマイザ(CBO)が使用されるようになりました。

一般に、CBOは「計画の安定性」の問題を導入しましたが、RBOの計画は常に同じままでした。

CBOを使用することは、統計および/または動的サンプリングデータの変更に基づいて実行プランを独自に変更することができ、変更されることを意味します。実際には、プランの切り替え履歴を監視できるツールがあります(lab128など)。

クエリを見たときに気づいたもう1つの点:フィルターがないため、実際の主キーが何であるかに応じて、インデックススキャンの用途がほとんどないことがあります。

+0

@ mvb13 - これは私の推測です。データ。ある時点で正確に同じデータに基づいて説明計画を生成し、それを比較することはできますか? (2つの異なるセッションで2つのクエリを実行する場合、まったく同じ時間であっても、一方または両方のセッションにコミットされていないトランザクションがある場合でも、データが異なる可能性があります)。 – mathguy

関連する問題