はい、はい。
Oracle は、このインライン ビューを実質的にテーブルとして扱います。述語プッシュを使用して、インライン ビューのフィルターをベース テーブルに適用し、場合によってはインデックスを使用できます。説明計画はこれを示します。
テーブル、インデックス、サンプル データ、および統計
create table table1(col1 number, col2 number, col3 number, col4 number);
create table table2(col1 number, col2 number, col3 number, col4 number);
create index table1_idx on table1(col1);
create index table2_idx on table2(col1);
insert into table1 select level, level, level, level
from dual connect by level <= 100000;
insert into table2 select level, level, level, level
from dual connect by level <= 100000;
commit;
begin
dbms_stats.gather_table_stats(user, 'TABLE1');
dbms_stats.gather_table_stats(user, 'TABLE2');
end;
/
述語のプッシュとインデックス アクセスを示すプランの説明
explain plan for
select * from
(
select col1, col2, col3, col4 from table1
union all
select col1, col2, col3, col4 from table2
)
where col1 = 1;
select * from table(dbms_xplan.display);
Plan hash value: 400235428
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 40 | 2 (0)| 00:00:01 |
| 1 | VIEW | | 2 | 40 | 2 (0)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | TABLE ACCESS BY INDEX ROWID BATCHED| TABLE1 | 1 | 20 | 2 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | TABLE1_IDX | 1 | | 1 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID BATCHED| TABLE2 | 1 | 20 | 2 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | TABLE2_IDX | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("COL1"=1)
6 - access("COL1"=1)
述語が , の前にどのように発生しVIEW
、両方のインデックスが使用されているかに注意してください。デフォルトでは、すべてが期待どおりに機能するはずです。
ノート
このタイプのクエリ構造は、インライン ビューと呼ばれます。物理テーブルは作成されませんが、「内部テーブル」という言葉は、クエリが論理的にどのように機能するかを考える良い方法です。理想的には、インライン ビューは、同じデータを使用して事前に作成されたテーブルとまったく同じように機能します。実際には、そのようにうまくいかない場合もあります。しかし、一般的には間違いなく正しい道を進んでいます。小さなインライン ビューを組み立てて大きなクエリを作成し、Oracle がそれを正しく最適化すると仮定します。