I have query that join two very big tables and ran explain plan on that it showing like this..
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 31 | 7 (0)| 00:00:01 |
| 1 | PX COORDINATOR | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | | | | |
| 3 | NESTED LOOPS | | | | | |
| 4 | NESTED LOOPS | | 1 | 31 | 7 (0)| 00:00:01 |
| 5 | PX PARTITION HASH ALL | | 1 | 17 | 5 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID| Tab1 | 1 | 17 | 5 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | Tab1_PK | 1 | | 4 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | tab2_PK | 1 | | 1 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID | Tab2 | 1 | 14 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------
Query:
select t2.colC,t2,colD,t1.colX
from tab2 t2
join tab1 t1 on t2.colA=t1.colA
and t1.colB=2345
and t2.colC in (123,456,789);
TABLE ACCESS BY INDEX ROWID
は、オプティマイザーがインデックスまたはスキャンテーブルのrowid
にアクセスして、rowids
を取得していることを意味しますか?
現在、クエリは数秒で終了しています。しかし、計画では、インデックスを使用しないと述べており、両方のテーブルに適切なインデックスがあります。
TABLE ACCESS BY INDEX ROWID
は、Oracleカーネルがインデックスを通過し、必要なすべての情報がインデックスに含まれているわけではないことを認識していることを意味します(必要な列はこのインデックスに含まれていません)。したがって、実際のテーブルデータ(rowid)へのポインタを取得し、それを検索します。
この場合、物事をより速く実行するための一般的なトリックは、(一意ではない)インデックスに欠落している列を含めることです。インデックスが大きくなる代わりに、テーブルでの1回のルックアップを回避します。
INDEXROWIDによるテーブルアクセス-それについて2つのことを知っておく必要があります
行のROWIDは、その行を含むデータファイルとデータブロック、およびそのブロック内の行の場所を指定します。 rowidを指定して行を見つけることは、データベース内の行の正確な場所を指定するため、単一の行を取得する最も速い方法です。
インデックスの検索は、Oracleにとって高速で効率的な操作であり、Oracleが探している目的の値を見つけると、他のテーブルでレコードのROWIDを見つけることもできます。 Oracleは、クエリで要求された場合、このROWIDを使用して詳細情報をフェッチできます。