from http://www.itpub.net/thread-1852897-1-1.html

有论坛朋友在上面的帖子里问SQL为什么不走索引,正好这两天我也刚刚在看SQL优化,于是试着回答了一下.

下面是原来的SQL:

select o.order_id as orderId  from order_info o, member m
where m.member_id = o.member_id
   and o.is_delete = 'N'
   /*and (to_date(nvl(o.paid_time,o.commit_time), 'YYYY-MM-DD hh24:mi:ss') >=
       to_date('2014-03-27 00:00:00', 'YYYY-MM-DD hh24:mi:ss'))
   and (to_date(nvl(o.paid_time,o.commit_time), 'YYYY-MM-DD hh24:mi:ss') <=
       to_date('2014-03-27 23:59:59', 'YYYY-MM-DD hh24:mi:ss'))*/
   and o.commit_time like '2014-03-27%'
   and ((o.payment_mode = 'KDFH' and o.IS_PAID = 'Y') or
       (o.payment_mode = 'HDFK'))
   and o.order_state NOT in (18, 19, 25)
   and (exists (select 1
                  from fecerp.sys_role_select rs, fecerp.sys_role_user su
                 where su.role_id = rs.role_id
                   and su.user_id = 3132
                   and su.is_delete = 'N'
                   and rs.othera = 0) OR exists
        (select 1
           from fecerp.sys_role_select   rs,
                fecerp.sys_role_user     su,
                product_yw_catalog       pyc,
                product_yw_catalog_goods ycg,
                order_item               oi
          where su.role_id = rs.role_id
            and pyc.yw_catalog_id = ycg.wy_catalog_id
            and su.user_id = 3132
            and rs.othera <> 0
            and su.is_delete = 'N'
            and ',' || rs.bus_ids || ',' like
                '%,' || pyc.yw_catalog_id || ',%'
            and oi.order_id = o.order_id
            and oi.is_delete = 'N'
            and ycg.goods_no = oi.goods_no))
   and (select m.multi_channel_id
          from ec_multi_channel m
         where m.multi_channel_id = o.multi_channel_id) in
       (select ser.multi_channel_id
          from fecerp.sys_role_channel ser, fecerp.sys_role_user uss
         where ser.role_id = uss.role_id
           and ser.is_delete = 'N'
           and uss.is_delete = 'N'
           and uss.user_id = 3132)

执行计划:

order_info 索引如下:

和统计信息的关系不大,至少表order_info 的统计信息是正确的,否则table full access的cost不会这么高. 
不走索引应该是下面的原因.

  • o.is_delete = 'N'  --这个字段上没有索引
  • o.commit_time like '2014-03-27%'  --这个字段上没有索引
  • ((o.payment_mode = 'KDFH' and o.IS_PAID = 'Y') or (o.payment_mode = 'HDFK'))  --在payment_mode 和 IS_PAID 上虽然分别有索引,但是 对于条件 o.payment_mode = 'KDFH' and o.IS_PAID = 'Y') 如果走索引,那么是需要同时判断这两个字段的值. 这里没有基于这两个字段的索引,所以也走不了.
  • o.order_state NOT in (18, 19, 25) -- not in 排除常量,走不了索引

推荐在 payment_mode  和 IS_PAID 上建立一个组合索引.

诊断一句SQL不走索引的原因的更多相关文章

  1. SQL语句优化、mysql不走索引的原因、数据库索引的设计原则

    SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...

  2. mysql 索引优化,索引建立原则和不走索引的原因

    第一:选择唯一性索引 唯一性索引的值是唯一的,可以更快捷的通过该索引来确定某条记录. 2.索引的列为where 后面经常作为条件的字段建立索引 如果某个字段经常作为查询条件,而且又有较少的重复列或者是 ...

  3. oracle 不走索引的原因

    create table tb2 as select * from emp;alter table tb2 modify empno number(4) not null;翻到20W行 create ...

  4. Oracle执行计划不走索引的原因总结

    在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下. 不走索引大体有以下几个原 ...

  5. 【摘】Oracle执行计划不走索引的原因总结

    感谢原博主 http://soft.chinabyte.com/database/364/12471864.shtml 在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的 ...

  6. 什么样的 SQL 不走索引

    参考: MySQL 索引优化全攻略 索引建立的规则 1.能创建唯一索引就创建唯一索引 2.为经常需要排序.分组和联合操作的字段建立索引 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条 ...

  7. ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度

    (一)索引失效的原因分析: <>或者单独的>,<,(有时会用到,有时不会) 有时间范围查询:oracle 时间条件值范围越大就不走索引 like "%_" ...

  8. Oracle直方图导致SQL不走索引.

    在ITPUB 上看到一个帖子 http://www.itpub.net/thread-1875212-1-1.html 同一条SQL语句,只有查询条件不一样,查询返回的结果集都为0,一个走了全表扫描, ...

  9. mysql 索引优化,不走索引的原因

    1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引 2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…) ...

随机推荐

  1. JS。 问题类型:穷举,迭代。两个关键词:break和continue

    问题类型: 穷举:(在不知道什么情况下是我们需要的结果的时候只能够让它一个一个都给走一遍) 百鸡百钱:公鸡1钱,母鸡2钱,小鸡0.5钱. 思路: 公鸡买100只,母鸡,小鸡都是0只: 母鸡50只,公鸡 ...

  2. hdu acm steps Big Event in HDU

    上网搜了一下这道题的解法,主要有两个方法,一种是采用母函数的方法,一种是采用0/1背包的方法. 先说一下母函数,即生成函数,做个比喻,母函数就是一个多项式前面的系数的一个整体的集合,而子函数就是这个多 ...

  3. 如何设置NBU的Backup, Archive and Restore

    第一行表示Master Server 第二行猜测表示当前主机 第三行不清楚   总结: 1. 这里压根就没有Media Server的事, Media Server对整个备份系统来说是透明的. 2. ...

  4. PHP 设计模式 笔记与总结(8)策略模式

    ① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式. ② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示 ...

  5. Web 在线文件管理器学习笔记与总结(17)复制文件 (18)剪切文件

    (17)复制文件 ① 复制文件通过copy($src,$dst) 来实现 ② 检测目标目录是否存在,如果存在则继续检测目标目录中是否存在同名文件,如果不存在则复制成功 file.func.php 中添 ...

  6. Unity 父物体与子物体位置

         酷跑片段本来想做三条轨道,然后通过切换轨道来做,后面发现一种巧妙的方法,利用物体的父级偏移来实现轨道的切换. 比如上图,实际运动的是Car对象,通过修改MineControler的左右位置( ...

  7. apache磁盘缓存配置

    确保mod_cache和mod_disk_cache是开启的 配置如下: CacheDefaultExpire 86400 #失效时间,单位秒CacheEnable disk /      #缓存路径 ...

  8. ORACLE的安装与网页版创建表空间的简单操作以及PLsql的简单操作

    1.oracle的安装: 安装简单易学,在这里不做解释.下载看装包后耐心等待,注意安装目录不要有中文字符,尽量按照指定目录进行安装.安装完成后会占用有大约5g的内存. 如果要卸载oracle,需要用其 ...

  9. flex mxmlc 手动编译项目

    首先: 1.下载flex的sdk,如果你电脑有装flash builder,它自带了一份,位于安装目录的sdks目录下. 备注:(sdk依赖java的jre) 2.配置mxmlc的java运行环境jr ...

  10. maven 添加本地jar

    方式一 Xml代码 <dependency> <groupId>org.apache</groupId> <artifactId>test</ar ...