-2

マージ クエリを実行すると、インデックスが読み取れず、クエリの実行が非常に遅くなります。

stage_dim_accounts(rbc_code) のインデックス

map_rbc_etl(free_code_9) のインデックス

MERGE INTO stage_dim_accounts t 
USING map_rbc_etl s ON (t.rbc_code = s.free_code_9)
WHEN MATCHED THEN UPDATE 
SET t.indx_no= s.indx_no  
WHERE s.annexure= 'AXN-I' 
AND (.free_code_9 <> 'NA' AND s.free_code_9   <> '0') 
AND t.rbc_code <> 'NA'

前もって感謝します

4

2 に答える 2

3

オプティマイザーは、インデックスが役に立たないことを認識できるほどスマートです。

その列のほとんどの値が '0' または 'NA' のいずれかである場合、インデックスfree_codeが役立つ場合があります。データ量や分布に関する情報を提供していないため、わかりません。ただし、 には他の制限基準が map_rbc_etlあるため、データベースはとにかくテーブルに移動する必要があります。私の推測では、オプティマイザーは map_rbc_etl で完全なテーブル スキャンを使用することを選択したと思います。

これは、インデックス付き読み取りが 2 つの操作 (インデックスの読み取り、行の読み取り) であるためです。したがって、読み取られた行の割合が小さい場合にのみ配当が支払われます。それ以外の場合は、すべての行を読み取り、メモリ内で選別する方が効率的です。

チューニングの重要な「秘密」は次のとおりです。インデックス付きの読み取りは常に高速であるとは限りません。全テーブル スキャンが必ずしも悪いわけではありません。

の読み取りにも同様のロジックが適用されますstage_dim_accounts。インデックス付きの列が選択的である可能性は低いです。map_rbc_etlの行数が非常に少なく、 の少数の行の選択にしか一致し ない場合を除きます stage_dim_accounts。データ メトリックに関する以前のコメントが再び適用されます。

于 2013-03-14T12:33:48.553 に答える
0

map_rbc_etl( free_code_9, annexure) および stage_dim_accounts(rbc_code) で使用するインデックス;

現在、これらは前の回答の理由で使用されていない可能性があります。索引が使用されないその他の理由は次のとおりです。 1. 最適化プログラムは、索引を使用しない方が効率的であると判断します。2. 列がビューにあり、列に関数呼び出しがある場合。これを使用するには、関数ベースのインデックスを使用します。3. クエリで数学演算を実行します。説明計画を見て、行のロード方法と一致するようにインデックスを作成できることに注意してください。4. where 句で列を連結します。これを克服するには、関数ベースのインデックスを使用します。5. ステートメントの where 句の連結インデックスに最初の列を含めません。Oracle 9i 以降ではスキャンをスキップし、インデックスを使用できることに注意してください。6. または句を使用します。この場合、or 句以外のすべてに対して 1 つのインデックスを作成し、or の各値に対して 1 つのインデックスを作成すると、すべてのインデックスが適切に使用されます。

関数ベースのインデックスの使用方法がわからない場合は、where 句で to_upper() の例を使用します。

create indexName on tableName(to_upper(colname));

任意の oracle sql 関数 (組み込みまたはユーザー作成) をインデックスに含めることができます。

于 2013-03-29T20:02:13.117 に答える