5

Oracle インストールのテーブルには、2 つの列 (X と Y) にインデックスを持つテーブルがあります。列 X のみにアクセスする where 句を使用してテーブルに対してクエリを実行すると、Oracle はインデックスを使用できますか?

例えば:

テーブル Y: Col_A、Col_B、Col_C、

(Col_A、Col_B) にインデックスが存在します

SELECT * FROM Table_Y WHERE Col_A = 'STACKOVERFLOW';

インデックスが使用されるか、それともテーブル スキャンが実行されますか?

4

1 に答える 1

9

場合によります。

オラクルに実行計画を説明させることで確認できます。

EXPLAIN PLAN FOR 
   SELECT * FROM Table_Y WHERE Col_A = 'STACKOVERFLOW';

その後

select * from table(dbms_xplan.display);

したがって、たとえば

create table table_y (
  col_a varchar2(30),
  col_b varchar2(30),
  col_c varchar2(30)
);

create unique index table_y_ix on table_y (col_a, col_b);

そして、

explain plan for
  select * from table_y
  where col_a = 'STACKOVERFLOW';

select * from table(dbms_xplan.display);

(私のインストールでの)計画は次のようになります。

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    51 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TABLE_Y    |     1 |    51 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TABLE_Y_IX |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("COL_A"='STACKOVERFLOW')

ID 2 は、インデックスTABLE_Y_IXが実際に に使用されていることを示していますindex range scan

別のインストールで Oracle がインデックスを使用することを選択した場合、多くのことに依存します。この決定を行うのは、Oracle のクエリ オプティマイザです。

更新オラクルがインデックスを使用した場合に(パフォーマンスに関して)より良いと思われる場合は、+ index_asc(...)インデックスのヒントを参照)を試してみてください。

あなたの場合、それは次のようになります

SELECT /*+ index_asc(TABLE_Y TABLE_Y_IX) */ * 
  FROM Table_Y 
 WHERE Col_A = 'STACKOVERFLOW';

さらに、テーブルとその列に関する統計を収集したことを確認してください。最後に統計を収集した日付は、

select last_analyzed from dba_tables where table_name = 'TABLE_Y';

select column_name, last_analyzed from dba_tab_columns where table_name = 'TABLE_Y';

統計がない場合、または統計が古くなっている場合は、dbms_statsそのような統計を収集するためにパッケージに慣れてください。

これらの統計は、クエリ オプティマイザーが決定を下すために大きく依存するデータです。

于 2012-08-15T14:43:04.937 に答える