Oracle
Oracle 會忽略我的索引嗎?
假設我有一個表(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')