oracle 11g nvarchar 索引不生效

cgxcgx520 2014-06-30 05:27:37
create table storagefile (
storagefileid number(9) ,
filename nvarchar2(512)
)

create index ix_filename on storagefile (filename)

filename 重复性小 结构为/PRODUCT/LEVEL1/XML/LIB/2014-06-30/XML-203-312-20140630_jpg
其中/PRODUCT/LEVEL1/XML/LIB/ 重复度很高

记录数140万条

select storagefileid,filename from storagefile where filename = '/PRODUCT/LEVEL1/XML/LIB/2014-06-30/XML-203-312-20140630_jpg '
解释计划
TABLE ACCESS FULL msp storagefile 14639 293730 51696480

如查询时,filename为前缀重复度不高的字符串时,解释计划会走索引
select storagefileid,filename from storagefile where filename = '/PRODUCT2/LEVEL1/XML/LIB/2014-06-30/XML-203-312-20140630_jpg '
解释计划
TABLE ACCESS BY INDEX ROWID msp STORAGEFILE 5 1 176
INDEX RANGE SCAN msp STORAGEFILE 4 1

filename 前16个字符为重复度不高的字符串时,查询会走索引。



...全文
448 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyee 2014-07-01
  • 打赏
  • 举报
回复
这和CBO的直方图有关,对于字符串来说,直方图只保存前32字节的统计信息,对于UNICODE字符串而言,那就是16个字符。如果前16个字符的重复率很高,那么将不会使用索引,参见all_tab_histogram的enpoint_actual_value列。 解决方法之一如楼上所说,使用reverse index。 另外可以采用基于substr函数的索引,毕竟 filename的平均列值比较长,所以产生的索引尺寸太大。
小灰狼W 2014-06-30
  • 打赏
  • 举报
回复
这种情况比较适用于反转索引,试试 create index 索引名称 on storagefile(filename ) reverse;
  • 打赏
  • 举报
回复
CBO --楼主可以去了解下CBO优化方式。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧