数据库 – 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小时才能执行,尽管我创建了上述两个索引. 作为实验,我测试了以下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”. 还有一些信息: >数据库是在我的本地计算机上安装的Oracle 11g. 如果有人能告诉我如何让Oracle在第一个查询中使用索引,我真的很高兴. 提前致谢. [01.10.2011:更新] 我想我找到了问题的解决方案. dynamic_col_1和dynamic_col_1_text这两列都可以为空.在更改表以禁止两列中的“NULL”值并仅为列年添加新索引之后,Oracle会执行快速索引扫描. 解决方法您确定索引访问速度比全表扫描更快吗?作为一个非常粗略的估计,全表扫描比读取索引快20倍.如果tab在2011年拥有超过5%的数据,那么Oracle将使用全表扫描就不足为奇了.正如@Dan和@Ollie所提到的那样,以年为第二列,这将使指数更慢.如果索引确实更快,那么问题可能是糟糕的统计数据.有数百种统计数据可能不好的方法.很简单,这是我先看到的内容: >使用和不使用索引提示运行解释计划.基数是否超过10倍?时间是10倍或更多吗? 此外,这与您的问题无关,但您可能希望避免使用带引号的标识符.一旦你使用它们,你必须在任何地方使用它们,它通常会使你的表和查询难以使用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |