今天在做SQL Tuning的时候遇到一个典型的example,立个Flag,梳理知识点,在这里也做个分享,就是我们在写SQL的时候如果对索引字段使用函数炒作,则导致该SQL不走索引扫描查询,导致SQL性能下降。

SQL如下:

SELECT NVL(A.USER_NAME_C, NVL(A.USER_NAME_E, A.USER_CODE)) USER_NAME, A.TEL_NO, A.FAX_NATION_CODE || A.FAX_AREA_CODE || A.FAX_LOCAL_NO FAX_NO FROM AAA3010 A, AAA3009 B WHERE A.CUST_SEQ_NO = B.CUST_SEQ_NO AND CUST_TYPE = 1 AND DECODE(A.USER_CODE,  'CN19000125', 1, 'WHL', 1, 2) = 1;

该SQL对A.USER_CODE字段使用DECODE函数,所以导致没有走Index扫描查询,如下该SQL的执行计划:

Execution Plan
----------------------------------------------------------
Plan hash value: 2797870618-------------------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |            |    20 |   920 |    56   (2)| 00:00:01 |
|   1 |  NESTED LOOPS                |            |    20 |   920 |    56   (2)| 00:00:01 |
|   2 |   NESTED LOOPS               |            |    62 |   920 |    56   (2)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL         | AAA3010    |    62 |  2356 |    43   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN         | AAA3009_PK |     1 |       |     1   (0)| 00:00:01 |
|*  5 |   TABLE ACCESS BY INDEX ROWID| AAA3009    |     1 |     8 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

看该Table结构,发现该Table的组合Index字段是(USER_CODE, CUST_SEQ_NO),如下图:

但是SQL对Index栏位调用Decode函数导致查询无法走索引扫描,通常如果有可替代方案则最好是不要对Index栏位使用函数,这里我们可以对该SQL拿掉Decode函数,改用In的方式查询,则查询时走索引扫描,提高SQL性能。

即修改成如下:

DECODE(A.USER_CODE,  'CN19000125', 1, 'WHL', 1, 2) = 1;  AND A.USER_CODE in('CN19000125','WHL');

则走Index扫描查询,如下该SQL的执行计划:

Execution Plan
----------------------------------------------------------
Plan hash value: 3932238443---------------------------------------------------------------------------------------------
| Id  | Operation                      | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |            |     2 |    92 |     2   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                  |            |     2 |    92 |     2   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                 |            |     2 |    92 |     2   (0)| 00:00:01 |
|   3 |    INLIST ITERATOR             |            |       |       |            |          |
|   4 |     TABLE ACCESS BY INDEX ROWID| AAA3010    |     2 |    76 |     1   (0)| 00:00:01 |
|*  5 |      INDEX RANGE SCAN          | AAA3010_PK |     2 |       |     1   (0)| 00:00:01 |
|*  6 |    INDEX UNIQUE SCAN           | AAA3009_PK |     1 |       |     1   (0)| 00:00:01 |
|*  7 |   TABLE ACCESS BY INDEX ROWID  | AAA3009    |     1 |     8 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

SQL索引字段使用函数操作导致不走索引相关推荐

  1. mysql函数做条件_MySQL语句优化(三):避免条件字段做函数操作

    今天跟各位分享一个生产环境慢查询的例子,是一个比较典型的"条件字段使用了函数导致无法走索引"的例子. 一.定位慢查询 首先发现慢查询告警,通过运维平台看到慢查询主要是下面这条:SE ...

  2. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

  3. mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...

    like百分号加前面一定不走索引吗? 正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面 ...

  4. 查询没有走索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!...

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  5. mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  6. mysql一张表两个索引字段是建两颗独立索引树吗?

    在 MySQL 中,一个索引就是一颗 B+ 索引树,所以这个和字段没关系,主要看建了几个索引 索引树是存储在磁盘上的 表 聚集索引(Clustered index ) 每个InnoDB表都有一个称为聚 ...

  7. SQL Server截取字符串函数操作

    1.SUBSTRING()函数 含义:从指定位置开始截取指定数量的字符. 使用:SUBSTRING(原字符,截取字符的起始位置,截取字符数量) 举例: 1.截取字符的起始位置是从1开始的,为0的话截取 ...

  8. mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引

    我有两张桌子.我写了一个查询来在一列上加入它们.此列在两个表中都已编制索引,但MySQL未使用索引.有人a)告诉我为什么和b)告诉我如何让MySQL使用索引快速加入这些表. 第一张表: CREATE ...

  9. 数据查询必备技能SQL调优:Mysql什么情况下不走索引

    背景分析 今天领导在查询报表时,发现特别慢,于是引发一系列关于sql优化的工作,最终发现是分析同学在进行多表关联时进行不等值关联造成全表扫描,且使用字段无索引造成1W条数据表和20W数据表关联时执行缓 ...

最新文章

  1. C++ 枚举类型基本知识
  2. 从网站上扒网页,保存为file文件格式
  3. LifeCycle原理分析
  4. 在centos 6.3下安装php 5.3.3 xdebug的方法与步骤
  5. [答网友问]让GridLength支持动画
  6. 牛客网 【每日一题】4月23日题目精讲 边的染色
  7. PP视频怎么设置可以运行多个客户端
  8. js判断软键盘是否开启弹出
  9. Ranger-AdminServer安装
  10. 【ARM-Linux开发】DRM学习(一)
  11. 如何关闭热点资讯,如何关闭360浏览器热点资讯
  12. 三元运算符(Java)
  13. 【AAAI2021】自动跨主题作文属性评分
  14. 如何打出好看的数学公式呢?
  15. 【2019杭电多校第二场1009=HDU6599】I Love Palindrome String(回文树的fail树)
  16. MOS管耗尽型和增强型的区别是什么呢?
  17. CSS属性分类扫描-表格属性
  18. bzoj1751 [Usaco2005 qua]Lake Counting
  19. 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码破解 道翰天琼认知智能api机器人接口。
  20. 【密码学基础】03 传统加密技术

热门文章

  1. 了解什么是Raid?Raid的作用是什么?
  2. Java、ios图片上传
  3. 性能测试——jmeter接口测试复习——断言——响应断言
  4. Centos7 搭建开源的Restful Api 集成测试工具 Hitchhiker
  5. 使用高通 Qfile 刷版本
  6. ios--融云即时通讯
  7. 数据传输高性能中间键Avro介绍及基本应用
  8. 使用vue3 +vite + typeScript + elementPlus搭建一个项目脚手架
  9. 2021年的元宇宙,1999年的互联网
  10. 什么是DVP?Digital Video Port