Oracle

Oracle 會忽略我的索引嗎?

  • April 27, 2017

假設我有一個表(TABLE_1),其中包含一些欄位,包括 ID(數字)、NAME(varchar2)和 DATE_TIME(日期)。需要在這 3 個欄位上創建索引以優化查詢,例如:

select * from TABLE_1 where ID = [SOME_VALUE] and NAME = [SOME_VALUE] and DATE_TIME is not null;

因為 DATE_TIME 可以有許多不同的日期時間值,所以我決定這樣創建索引:

CREATE INDEX IDX_TABLE_1 ON TABLE_1 (ID,NAME,TRUNC(DATE_TIME));

我的問題是:Oracle 會在選擇查詢上使用這個索引,還是會忽略它並對 TABLE_1 執行全表掃描?

EDIT1:我忘了提到 ID 欄位是外鍵。

取決於數據分佈。我可以輕鬆地為這兩種情況(索引與表掃描)建構範例。

想想列唯一或幾乎唯一(索引)或所有行都相同(表掃描)的情況。

從技術上講,您的索引可用於上述查詢。

鑑於名為 的列的一般性質ID,我會說將選擇索引,但不能保證。

謂詞DATE_TIME is not null將在表級別而不是索引級別處理,即使您確保 NULL 行也被索引:

create index index_1 on table_1(id, name, trunc(date_time), 1);

PLAN_TABLE_OUTPUT
-------------------------------------------------------
Plan hash value: 852675278

-------------------------------------------------------
| Id  | Operation                           | Name    |
-------------------------------------------------------
|   0 | SELECT STATEMENT                    |         |
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TABLE_1 |
|*  2 |   INDEX RANGE SCAN                  | INDEX_1 |
-------------------------------------------------------

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

  1 - filter("DATE_TIME" IS NOT NULL)
  2 - access("ID"=1 AND "NAME"='Oracle')

引用自:https://dba.stackexchange.com/questions/171812