小编ora*_*r54的帖子

Oracle 11g:未在"select distinct"-query中使用的索引

我的问题涉及Oracle 11g以及SQL查询中索引的使用.

在我的数据库中,有一个结构如下的表:

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;
Run Code Online (Sandbox Code Playgroud)

我创建了两个索引:

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;
Run Code Online (Sandbox Code Playgroud)

该表包含大约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"
Run Code Online (Sandbox Code Playgroud)

不幸的是,查询需要大约1小时才能执行,尽管我创建了上述两个索引.解释计划显示Oracle使用"表完全访问",即全表扫描.为什么不使用索引?

作为实验,我测试了以下SQL命令:

SELECT DISTINCT
 "dynamic_col_1" "AS_dynamic_col_1", "dynamic_col_1_text" "AS_dynamic_col_1_text"
 FROM "tab"
Run Code Online (Sandbox Code Playgroud)

即使在这种情况下,也不使用索引并执行全表扫描.

在我的真实数据库中,该表包含更多索引列,如"dynamic_col_1"和"dynamic_col_1_text".整个索引文件的大​​小约为50 GB.

还有一些信息:

  • 数据库是在我的本地计算机上安装的Oracle 11g.
  • 我使用的是Windows 7 Enterprise 64bit.
  • 整个索引分为3个dbf文件,大小约为50GB.

如果有人能告诉我如何让Oracle在第一个查询中使用索引,我真的很高兴.因为第一个查询被另一个程序用来从数据库中提取数据,所以很难改变.所以最好调整表格.

提前致谢.

[01.10.2011:更新] …

database oracle indexing

7
推荐指数
2
解决办法
7136
查看次数

标签 统计

database ×1

indexing ×1

oracle ×1