这条sql为何不走索引?

[复制链接]
查看11 | 回复8 | 2015-3-6 11:58:39 | 显示全部楼层 |阅读模式
本帖最后由 panda_rabbit 于 2015-7-2 09:47 编辑


1.jpg (57.01 KB, 下载次数: 0)
下载附件
2015-7-2 09:45 上传

tbilllog6表的callend列上有索引INDBILLLOG6_CALLEND,加索引hint后1秒内出结果,不加hint要执行17秒。


111.png (14.03 KB, 下载次数: 1)
下载附件
2015-7-2 09:41 上传

已执行如下命令,收集统计信息,
exec dbms_stats.gather_table_stats(ownname=>user,tabname=>'tbilllog6',estimate_percent=>100,no_invalidate=>false,method_opt=>'for all indexed columns size skewonly',cascade=>true)
但收集完后,仍然走全表扫描。


回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
把distinct去掉看一下.
回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
abao2000521 发表于 2015-7-2 10:18
把distinct去掉看一下.



3.png (10.88 KB, 下载次数: 2)
下载附件
2015-7-2 10:28 上传
还是走全表,这个表中callid不是主键,有很多重复值,不能去掉distinct的。
回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
用10053事件跟踪一下。
回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
你这个表是按什么分区,calleeno 是本地索引是吧.,这一表有多少条数据,2015-06-08到2015 -06-24号13800100203这个号码有多少条数.
把or改成union all试一下.
selectcallid from tbilllog6 where t.calllend>=to_date('2015-06-18','yyyy-mm-dd') andt.calllend=to_date('2015-06-18','yyyy-mm-dd') andt.calllend= to_date('2015-06-18', 'yyyy-mm-dd')and t.callend <= to_date('2015-06-24', 'yyyy-mm-dd') --348911
select count(*) from tbilllog6 twheret.calleeno in ('13800100203')
--2168129

回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
加一个 and callend is not null
回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
增加一个calleeno 和callend 的组合索引吧
select count(*) from tbilllog6 twheret.calleeno in ('13800100203')
--2168129 索引效率不高

回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
本帖最后由 panda_rabbit 于 2015-7-2 12:46 编辑
2009532140 发表于 2015-7-2 11:03
加一个 and callend is not null
刚才我看错了,加上条件后,还是走全表。
回复

使用道具 举报

千问 | 2015-3-6 11:58:39 | 显示全部楼层
dmp个出来研究下。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行