2

UNIQUE非インデックスを持つ列を使用するビューを作成しています。ただし、私の見解のコンテキスト内では、列には一意の値のみが含まれると確信しています (WHERE句で課された条件のため)。

実際の問題は、誰かがその列に基づいてビューにクエリを実行したときに発生します (例: SELECT * FROM MY_VIEW WHERE COLUMN_WITH_NON_UNIQUE_INDEX = 'foo')。オプティマイザーは、多くの行を受け取ることになると確信しています (インデックスが技術的にないためUNIQUE)。このため、オプティマイザーはビューの他の場所で他のインデックスを使用することを避け、全テーブル スキャンを優先します (クールではありません)。

インデックスのない列UNIQUEに実際に一意の値が含まれることをオプティマイザに納得させる方法はありますか? 確かに、重複した値が列に忍び込む可能性はありますが、これはバグと見なされ、正当な一意のデータが損なわれることはありません。

残念ながら、私は問題のテーブルを制御できません (ため息)。

4

2 に答える 2

2

Oracle では、強制されていないがオプティマイザにまさにこの種の情報を提供するビューに一意の (および主キー) 制約を作成できます。

ALTER VIEW your_view_name
  ADD CONSTRAINT name_of_constraint UNIQUE( column_with_non_unique_index )
  RELY DISABLE NOVALIDATE;

これにより、データが一意であるという事実に依存できるが、制約を検証する必要がないことが Oracle に通知されます。ただし、オプティマイザーは、制約が提供する追加のメタデータを使用できます。

于 2012-10-16T14:41:05.383 に答える
1

次のことを試すことができます。

METHOD_OPT を FOR ALL COLUMNS SIZE AUTO に設定して dbms_stats を使用して表の統計を収集します。この設定により、Oracle は、ヒストグラムが必要な列と各ヒストグラムのバケット数 (サイズ) を自動的に決定します。ヒストグラムを持つ列と各ヒストグラムのサイズを手動で指定することもできます。

dbms_stats.gather_table_stats(
ownname => 'schemaname' ,
tabname => 'tablename' ,
estimate_percent => 100 ,
method_opt => 'for all indexed columns size auto' ,
 cascade => true);
于 2012-10-16T12:24:55.807 に答える