クエリの 1 つでインデックスが使用されない理由がわかりません。
次の 2 つのクエリは問題ありません。一枚目はこちら
SELECT XHHA.* , XSAIL.*
FROM TABLE_A XSAIL,
xxd_hist_headers_all XHHA
WHERE XSAIL.id = 'XXXX'
AND XHHA.CONTRACT_NUMBER = XSAIL.CONTRACT_NUMBER
AND XHHA.history_flag = 'VALID'
AND XHHA.buff_flag = 'N'
インデックスが使用されていることがわかる次の実行計画が表示されます。
Plan
SELECT STATEMENT CHOOSECost: 451 Bytes: 1 332 628 342 Cardinality: 4 087 817
5 NESTED LOOPS Cost: 451 Bytes: 1 332 628 342 Cardinality: 4 087 817
2 TABLE ACCESS BY INDEX ROWID APPS.TABLE_A_N1 Cost: 1 Bytes: 266 911 Cardinality: 2 999
1 INDEX RANGE SCAN NON-UNIQUE APPS.TABLE_A_N1 Cost: 1 Cardinality: 2 999
4 TABLE ACCESS BY INDEX ROWID XXD.XXD_HIST_HEADERS_ALL Cost: 1 Bytes: 32 304 522 Cardinality: 136 306
3 INDEX RANGE SCAN NON-UNIQUE XXD.XXD_HIST_HEADERS_N1 Cost: 2 Cardinality: 136 306
以下の 2 番目のリクエスト:
SELECT XHHA.*, XPHA.*
FROM
xxd_hist_headers_all XHHA,
XXD_POLICY_HIST_ALL XPHA
WHERE XHHA.CONTRACT_NUMBER = 'XXXX'
AND XHHA.history_flag = 'VALID'
AND XHHA.buff_flag = 'N'
AND XPHA.CONTRACT_NUMBER = XHHA.CONTRACT_NUMBER
インデックスがまだ使用されていることがわかる次の実行計画が表示されます。
Plan
SELECT STATEMENT CHOOSECost: 2 Bytes: 302 Cardinality: 1
5 NESTED LOOPS Cost: 2 Bytes: 302 Cardinality: 1
2 TABLE ACCESS BY INDEX ROWID XXD.XXD_POLICY_HIST_ALL Cost: 1 Bytes: 65 Cardinality: 1
1 INDEX UNIQUE SCAN UNIQUE XXD.XXD_POLICY_HIST_U1 Cost: 2 Cardinality: 2
4 TABLE ACCESS BY INDEX ROWID XXD.XXD_HIST_HEADERS_ALL Cost: 1 Bytes: 237 Cardinality: 1
3 INDEX RANGE SCAN NON-UNIQUE XXD.XXD_HIST_HEADERS_N1 Cost: 2 Cardinality: 1
次に、この 3 番目のクエリを作成します。これは、前の 2 つのクエリを多かれ少なかれ結合したものです。
SELECT XHHA.* , XSAIL.*, XPHA.*
FROM TABLE_A XSAIL,
xxd_hist_headers_all XHHA,
XXD_POLICY_HIST_ALL XPHA
WHERE XSAIL.id = 'XXXX'
AND XHHA.CONTRACT_NUMBER = XSAIL.CONTRACT_NUMBER
AND XHHA.history_flag = 'VALID'
AND XHHA.buff_flag = 'N'
AND XPHA.CONTRACT_NUMBER = XHHA.CONTRACT_NUMBER
これ以上インデックスは使用されず、関連する 3 つのテーブルのうち 2 つのフル スキャンが実行されます。
Plan
SELECT STATEMENT CHOOSECost: 9 695 Bytes: 2 014 546 788 Cardinality: 4 145 158
6 HASH JOIN Cost: 9 695 Bytes: 2 014 546 788 Cardinality: 4 145 158
2 TABLE ACCESS BY INDEX ROWID APPS.TABLE_A_N1 Cost: 1 Bytes: 551 816 Cardinality: 2 999
1 INDEX RANGE SCAN NON-UNIQUE APPS.TABLE_A_N1 Cost: 1 Cardinality: 2 999
5 HASH JOIN Cost: 9 004 Bytes: 41 741 836 Cardinality: 138 218
3 TABLE ACCESS FULL XXD.XXD_POLICY_HIST_ALL Cost: 114 Bytes: 18 903 625 Cardinality: 290 825
4 TABLE ACCESS FULL XXD.XXD_HIST_HEADERS_ALL Cost: 821 Bytes: 32 757 903 Cardinality: 138 219
この 3 番目のリクエストでインデックスが使用されていない理由はありますか? これが何らかの影響を与える場合、(機密性の問題のために) 名前を「TABLE_A」に変更したテーブルは、実際にはマテリアライズド ビューです。
親切な回答/質問/提案をありがとう.
(初めて投稿するので、編集が適切でない場合はご容赦ください)。