1

TABLE-1 と TABLE-2 の 2 つのテーブルがあり、各テーブルには 10 列の 100 万行があり、col1 にインデックスがあるとします。

次に、この 2 つのテーブル (1 + 1 = 200 万) 行に内部テーブルを作成します。

select * from 
(select col1, col2,....col10 from table-1
union all
select col1, col2,....col10 from table-2) x

質問、

how will the internal table will be treated in Oracle since its a internal table..
1. Will the internal table will be treated as a table with index on col1?
2. Will this be captured in the Explain plan?
4

2 に答える 2

1

はい、はい。

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 がそれを正しく最適化すると仮定します。

于 2013-10-16T01:36:22.730 に答える
0

特定のクエリではインデックスは使用されませんが、フィルタリングを行うと思います。つまりwhere x.col1 = ###、オラクルがテーブル1/テーブル2インデックスを使用してフィルタリングできるかどうかわからないので、配置することをお勧めします「ユニオン クエリ」内の where ステートメント

于 2013-10-15T19:21:00.560 に答える