ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 4656|回复: 12

[讨论] 为什么Where条件没有走索引呢

[复制链接]
论坛徽章:
3
复活蛋
日期:2012-02-15 22:12:02ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20优秀写手
日期:2013-12-18 09:29:13
发表于 2017-1-5 23:09 | 显示全部楼层 |阅读模式
本帖最后由 东北胖子 于 2017-1-5 23:16 编辑

1、SQL语句是这样的,我省去了字段名称直接用 * 来代替了
SELECT *
  FROM TEST_TT_INFO P
INNER JOIN TEST_TT_REG R
    ON R.CARD_NO = P.CARD_NO
  LEFT JOIN (SELECT C.CODE,
                    C.DATETYPE,
                    MAX(C.CONFIRM_CHK_DATE) CONFIRM_CHK_DATE
               FROM TEST_TT_CONFIRMTIME C
              GROUP BY C.CODE, C.DATETYPE, SUBSTR(C.CONFIRM_CHK_DATE, 1, 10)) T
    ON R.CODE = T.CODE
   AND T.DATETYPE = 0
WHERE (P.NO = ENCRYPT_DES(LOWER('1211110070030'), 'XXXXXX') OR
       P.HOME_TEL = ENCRYPT_DES('1211110070030', 'XXXXXX'))

SQL语句在生产环境中的执行计划是这样的,其中   HOME_TEL   和   NO    列是建有B-Tree索引的,但是为什么它不能走索引呢。TEST_TT_INFO表大约有4万多数据
QQ截图20170105230725.png



其中 TEST_TT_LIST  表是在  Select  列中使用的,有一个列的值是用查询得到的

论坛徽章:
113
罗罗诺亚·索隆
日期:2017-02-08 15:50:20布鲁克
日期:2017-02-09 14:54:03秀才
日期:2017-02-22 15:14:12蒙奇·D·路飞
日期:2017-04-10 18:09:45布鲁克
日期:2017-04-18 14:36:29弗兰奇
日期:2017-06-02 08:58:04
发表于 2017-1-6 01:23 | 显示全部楼层
……你想让它使用index bitmap or 这样的执行计划么?
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
3
复活蛋
日期:2012-02-15 22:12:02ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20优秀写手
日期:2013-12-18 09:29:13
 楼主| 发表于 2017-1-6 09:13 来自手机 | 显示全部楼层
zergduan 发表于 2017-1-6 01:23
……你想让它使用index bitmap or 这样的执行计划么?

我想让它分开走两个列的索引。如果走不了需要怎么优化呢,执行一次太慢,大约五秒。

使用道具 举报

回复
论坛徽章:
113
罗罗诺亚·索隆
日期:2017-02-08 15:50:20布鲁克
日期:2017-02-09 14:54:03秀才
日期:2017-02-22 15:14:12蒙奇·D·路飞
日期:2017-04-10 18:09:45布鲁克
日期:2017-04-18 14:36:29弗兰奇
日期:2017-06-02 08:58:04
发表于 2017-1-6 09:24 | 显示全部楼层
如果这两列上有单独索引,这个SQL只能走index bitmap or的方式使用索引,转换bitmap的cost被cbo认为高于全表扫描。有两种办法,1. 使用hint 2.干脆改写or为union这样无需转换bitmap
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
113
罗罗诺亚·索隆
日期:2017-02-08 15:50:20布鲁克
日期:2017-02-09 14:54:03秀才
日期:2017-02-22 15:14:12蒙奇·D·路飞
日期:2017-04-10 18:09:45布鲁克
日期:2017-04-18 14:36:29弗兰奇
日期:2017-06-02 08:58:04
发表于 2017-1-6 09:31 | 显示全部楼层
但是这些改动仅仅目的是使用索引,是否比现在的效率高,就不一定了,你这个SQL使用标量,如果是变量,结果集数量不固定,就不好说是否效率高了。

来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
3
复活蛋
日期:2012-02-15 22:12:02ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20优秀写手
日期:2013-12-18 09:29:13
 楼主| 发表于 2017-1-6 10:12 来自手机 | 显示全部楼层
zergduan 发表于 2017-1-6 09:24
如果这两列上有单独索引,这个SQL只能走index bitmap or的方式使用索引,转换bitmap的cost被cbo认为高于全 ...

感谢帮助,我试一试用union的改写。还有就是我看了那两个索引的CF很高,跟数据的条数一致,这个有影响吗?

使用道具 举报

回复
论坛徽章:
3
复活蛋
日期:2012-02-15 22:12:02ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20优秀写手
日期:2013-12-18 09:29:13
 楼主| 发表于 2017-1-6 10:34 来自手机 | 显示全部楼层
zergduan 发表于 2017-1-6 09:31
但是这些改动仅仅目的是使用索引,是否比现在的效率高,就不一定了,你这个SQL使用标量,如果是变量,结果 ...

改成union执行效率变快了,谢谢。

使用道具 举报

回复
论坛徽章:
113
罗罗诺亚·索隆
日期:2017-02-08 15:50:20布鲁克
日期:2017-02-09 14:54:03秀才
日期:2017-02-22 15:14:12蒙奇·D·路飞
日期:2017-04-10 18:09:45布鲁克
日期:2017-04-18 14:36:29弗兰奇
日期:2017-06-02 08:58:04
发表于 2017-1-6 13:27 | 显示全部楼层
东北胖子 发表于 2017-1-6 10:12
感谢帮助,我试一试用union的改写。还有就是我看了那两个索引的CF很高,跟数据的条数一致,这个有影响吗 ...

CF控制返表的成本,但是如果结果集很小成本不会很高。
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
7
优秀写手
日期:2013-12-18 09:29:08问答徽章
日期:2014-02-07 23:48:392014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09马上有钱
日期:2014-10-26 21:51:11暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
发表于 2017-1-7 22:27 来自手机 | 显示全部楼层
zergduan 发表于 2017-1-6 09:31
但是这些改动仅仅目的是使用索引,是否比现在的效率高,就不一定了,你这个SQL使用标量,如果是变量,结果 ...

大佬,可不可以复合索引方式??

使用道具 举报

回复
论坛徽章:
113
罗罗诺亚·索隆
日期:2017-02-08 15:50:20布鲁克
日期:2017-02-09 14:54:03秀才
日期:2017-02-22 15:14:12蒙奇·D·路飞
日期:2017-04-10 18:09:45布鲁克
日期:2017-04-18 14:36:29弗兰奇
日期:2017-06-02 08:58:04
发表于 2017-1-8 00:09 | 显示全部楼层
不可以的,因为是or,符合索引还得是变成两次扫描bitmap or,并且还有一次是skip scan
来自苹果客户端来自客户端

使用道具 举报

回复

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

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表