oracle query 没有数据,数据库 – 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;

我创建了两个索引:

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使用“表完全访问”,即全表扫描.为什么不使用索引?

作为实验,我测试了以下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个dbf文件,大小约为50GB.

如果有人能告诉我如何让Oracle在第一个查询中使用索引,我真的很高兴.

因为第一个查询被另一个程序用来从数据库中提取数据,所以很难改变.所以最好调整表格.

提前致谢.

[01.10.2011:更新]

我想我找到了问题的解决方案. dynamic_col_1和dynamic_col_1_text这两列都可以为空.在更改表以禁止两列中的“NULL”值并仅为列年添加新索引之后,Oracle会执行快速索引扫描.

优点是查询现在需要大约5秒执行而不是以前的1小时.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值