場合によります。
オラクルに実行計画を説明させることで確認できます。
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
そのような統計を収集するためにパッケージに慣れてください。
これらの統計は、クエリ オプティマイザーが決定を下すために大きく依存するデータです。