我的問題涉及Oracle 11g和SQL查詢中索引的使用。Oracle 11g:「select distinct」查詢中未使用的索引
在我的數據庫中,有被構造爲遵循表:
Table tab (
rowid NUMBER(11),
unique_id_string VARCHAR2(2000),
year NUMBER(4),
dynamic_col_1 NUMBER(11),
dynamic_col_1_text NVARCHAR2(2000)
) TABLESPACE tabspace_data;
我已經創建了兩個指標:
CREATE INDEX Index_dyn_col1 ON tab (dynamic_col_1, dynamic_col_1_text) TABLESPACE tabspace_index;
CREATE INDEX Index_unique_id_year ON tab (unique_id_string, year) TABLESPACE tabspace_index;
表中包含約1〜2萬條記錄。我通過執行以下SQL命令從中提取數據:
SELECT distinct
"sub_select"."dynamic_col_1" "AS_dynamic_col_1","sub_select"."dynamic_col_1_text" "AS_dynamic_col_1_text"
FROM
(
SELECT "tab".* FROM "tab"
where "tab".year = 2011
) "sub_select"
不幸的是,查詢需要約1小時來執行,雖然我創建上面描述的兩個索引。 解釋計劃顯示Oracle使用「Table Full Access」,即全表掃描。爲什麼索引不被使用?
作爲實驗,我測試了以下SQL命令:在此情況下
SELECT DISTINCT
"dynamic_col_1" "AS_dynamic_col_1", "dynamic_col_1_text" "AS_dynamic_col_1_text"
FROM "tab"
,索引不使用並執行全表掃描。
在我的真實數據庫中,該表包含更多索引列,如「dynamic_col_1」和「dynamic_col_1_text」。 整個索引文件的大小約爲50 GB。
一些更多的信息:
- 數據庫是安裝在我的本地計算機上的Oracle 11g。
- 我使用Windows 7 Enterprise 64bit。
- 整個索引分成3個大小爲50GB的dbf文件。
我真的很高興,如果有人能告訴我如何讓Oracle在第一個查詢中使用索引。 因爲第一個查詢被另一個程序用來從數據庫中提取數據,所以很難改變它。所以最好調整表格。
在此先感謝。
[2011年1月10日:更新]
我想我已經找到了問題的解決方案。列dynamic_col_1
和dynamic_col_1_text
都是可空的。在更改表格以禁止兩列中的「NULL」值並僅爲列year
添加新索引後,Oracle執行快速索引掃描。 好處是,查詢現在需要大約5秒鐘執行,而不是像以前那樣1小時。
'rowid'字段是主鍵? –
請不要在表rowid中調用列,如果您需要使用實際的[僞列rowid](http://download.oracle.com/docs/cd /B19306_01/server.102/b14200/pseudocolumns008.htm) – Ben
@BogdanSahlean是的,rowid是主鍵 –