Sql执行过程中,对有索引的列上使用隐式类型转换或函数都会造成索引失效的情况,需要特别注意。
原sql语句如下
SELECT
TAB1.RECORDID ,
TAB1.F_CENTRAL_ID TAB1bh ,
TAB1.COLJSXID ,
(CASE WHEN TAB1.XCOLYIS NULL THEN ‘’ WHEN TAB1.XCOLY> CURRENT_DATE THEN ‘否’ ELSE ‘是’ END ) AS SFCQ,
TAB1.TAB2Q ,
TAB1.TAB1XS ,
TAB2.XM ,
TAB2.ZZ ,
TAB1.WTSD ,
TAB1.COLJMDDM ,
TAB1.NRFLDM ,
TAB1.GKXX ,
TAB1.DJRXM ,
TAB1.JTRXM ,
TAB1.DJBM ,
TAB1.XCOLKZSJ
FROM
TAB1XX TAB1
left JOIN TAB2XX TAB2
ON
TAB1.RECORDID = TAB2.TAB1ID
WHERE
TAB1.TAB1XS= 200
and exists
(
select
*
from
(
SELECT
B.TAB1ID,
B.TAB3SJ
FROM
TAB3FSXX B
WHERE
B.TAB3JGDM = ‘BW0061000000’
AND B.TAB3FSDM LIKE ‘03%’
AND B.TAB3ZT = 1
AND B.TAB3SJ >= TO_DATE(‘2021-01-01’, ‘YYYY-MM-DD hh24:mi:ss’)
and TAB1.recordid=B.TAB1id
order by
b.TAB3sj desc
limit 1
)
T
where
EXISTS
(
SELECT
1
FROM
TABXXX TABX
WHERE
TABX.SSTAB1ID = T.TAB1ID
AND TABX.SJRKSJ >= TO_DATE(‘2021-01-01’, ‘YYYY-MM-DD hh24:mi:ss’)
AND TABX.TABXRQ > T.TAB3SJ
)
)
AND NOT EXISTS
(
SELECT 1 FROM TAB1XX_SYQK SY WHERE SY.TAB1ID = TAB1.RECORDID
)
AND TAB1.DJSJ >= TO_DATE(‘2021-01-01’, ‘YYYY-MM-DD hh24:mi:ss’)
AND TAB2.TAB2DJSJ >= TO_DATE(‘2021-01-01’, ‘YYYY-MM-DD hh24:mi:ss’)
AND TAB1.DJSJ < TO_DATE(‘2021-09-14’, ‘YYYY-MM-DD hh24:mi:ss’) + 1
AND TAB2.TAB2DJSJ < TO_DATE(‘2021-09-14’, ‘YYYY-MM-DD hh24:mi:ss’) + 1
AND TAB1.COL1LIKE concat(’%’, ‘05’, ‘%’)
ORDER BY
TAB2Q DESC ;
原执行计划如下:
1 #NSET2: [12833, 62270, 776]
2 #PIPE2: [12833, 62270, 776]
3 #PRJT2: [12832, 62270, 776]; exp_num(16), is_atom(FALSE)
4 #SORT3: [12832, 62270, 776]; key_num(1), is_distinct(FALSE), top_flag(0), is_adaptive(0)
5 #HASH RIGHT SEMI JOIN2: [12816, 62270, 776]; n_keys(1) (ANTI), KEY(SY.TAB1ID=TAB1.RECORDID) KEY_NULL_EQU(0)
6 #SSCN: [1, 5828, 48]; IDX_TAB1XX_SYQK_TAB1ID(TAB1XX_SYQK as SY)
7 #SLCT2: [12803, 68098, 776]; NOREFED_EXISTS_SSS[sss3]
8 #SLCT2: [12803, 68098, 776]; (TAB2.TAB2DJSJ >= var4 AND TAB2.TAB2DJSJ < var7)
9 #NEST LOOP INDEX JOIN2: [12803, 68098, 776]
10 #SLCT2: [8254, 68098, 620]; (exp_cast(TAB1.TAB1XS) = 200 AND exp11 > 0)
11 #TAB3KUP2: [8254, 4352032, 620]; TAB1XXINDEX2(TAB1)
12 #SSEK2: [8254, 4352032, 620]; scan_type(ASC), TAB1XXINDEX2(TAB1XX as TAB1), scan_range[exp11,exp11+exp_cast(1))
13 #TAB3KUP2: [445, 1, 0]; IND_TAB2XX_TAB1ID(TAB2)
14 #SSEK2: [445, 1, 0]; scan_type(ASC), IND_TAB2XX_TAB1ID(TAB2XX as TAB2), scan_range[TAB1.RECORDID,TAB1.RECORDID]
15 #SPL2: [1, 1, 194]; key_num(1), spool_num(0), is_atom(FALSE), has_variaTAB3e(1)
16 #PRJT2: [1, 1, 194]; exp_num(1), is_atom(FALSE)
17 #INDEX JOIN SEMI JOIN2: [1, 1, 194]; join condition((TABX.TABXRQ > T.TAB3SJ AND TABX.SJRKSJ >= exp11))
18 #PRJT2: [1, 1, 194]; exp_num(2), is_atom(FALSE)
19 #SORT3: [1, 1, 194]; key_num(1), is_distinct(FALSE), top_flag(1), is_adaptive(0)
20 #SLCT2: [1, 1, 194]; (B.TAB3ZT = var8 AND B.TAB3SJ >= var9)
21 #TAB3KUP2: [1, 1, 194]; IDX_TAB3FSXX_TAB3JGDM_TAB1ID_TAB3FSDM_CRSJ(B)
22 #SSEK2: [1, 1, 194]; scan_type(ASC), IDX_TAB3FSXX_TAB3JGDM_TAB1ID_TAB3FSDM_CRSJ(TAB3FSXX as B), scan_range[(‘BW0061000000’,var3,‘03’,min),(‘BW0061000000’,var3,‘04’,min))
23 #TAB3KUP2: [1, 1, 0]; TABXXXINDEX2(TABX)
24 #SSEK2: [1, 1, 0]; scan_type(ASC), TABXXXINDEX2(TABXXX as TABX), scan_range[T.TAB1ID,T.TAB1ID]

注意“ TAB1.TAB1XS= 200”这一行,TAB1XS字段是varchar类型,等号后的200是数值型,产生了隐式类型转换,导致索引IDX_TAB1_TAB1XS_DJSJ没有被用到,修改为“ TAB1.TAB1XS= ‘200’”后执行计划变为:
1 #NSET2: [7170, 62270, 776]
2 #PIPE2: [7170, 62270, 776]
3 #PRJT2: [7169, 62270, 776]; exp_num(16), is_atom(FALSE)
4 #SORT3: [7169, 62270, 776]; key_num(1), is_distinct(FALSE), top_flag(0), is_adaptive(0)
5 #HASH RIGHT SEMI JOIN2: [7154, 62270, 776]; n_keys(1) (ANTI), KEY(SY.TAB1ID=TAB1.RECORDID) KEY_NULL_EQU(0)
6 #SSCN: [1, 5828, 48]; IDX_TAB1XX_SYQK_TAB1ID(TAB1XX_SYQK as SY)
7 #SLCT2: [7141, 68098, 776]; NOREFED_EXISTS_SSS[sss3]
8 #SLCT2: [7141, 68098, 776]; (TAB2.TAB2DJSJ >= var4 AND TAB2.TAB2DJSJ < var7)
9 #NEST LOOP INDEX JOIN2: [7141, 68098, 776]
10 #SLCT2: [2592, 68098, 620]; exp11 > 0
11 #TAB3KUP2: [2592, 1358097, 620]; IDX_TAB1_TAB1XS_DJSJ(TAB1)
12 #SSEK2: [2592, 1358097, 620]; scan_type(ASC), IDX_TAB1_TAB1XS_DJSJ(TAB1XX as TAB1), scan_range[(‘200’,exp11),(‘200’,exp11+exp_cast(1)))
13 #TAB3KUP2: [445, 1, 0]; IND_TAB2XX_TAB1ID(TAB2)
14 #SSEK2: [445, 1, 0]; scan_type(ASC), IND_TAB2XX_TAB1ID(TAB2XX as TAB2), scan_range[TAB1.RECORDID,TAB1.RECORDID]
15 #SPL2: [1, 1, 194]; key_num(1), spool_num(0), is_atom(FALSE), has_variaTAB3e(1)
16 #PRJT2: [1, 1, 194]; exp_num(1), is_atom(FALSE)
17 #INDEX JOIN SEMI JOIN2: [1, 1, 194]; join condition((TABX.TABXRQ > T.TAB3SJ AND TABX.SJRKSJ >= exp11))
18 #PRJT2: [1, 1, 194]; exp_num(2), is_atom(FALSE)
19 #SORT3: [1, 1, 194]; key_num(1), is_distinct(FALSE), top_flag(1), is_adaptive(0)
20 #SLCT2: [1, 1, 194]; (B.TAB3ZT = var8 AND B.TAB3SJ >= var9)
21 #TAB3KUP2: [1, 1, 194]; IDX_TAB3FSXX_TAB3JGDM_TAB1ID_TAB3FSDM_CRSJ(B)
22 #SSEK2: [1, 1, 194]; scan_type(ASC), IDX_TAB3FSXX_TAB3JGDM_TAB1ID_TAB3FSDM_CRSJ(TAB3FSXX as B), scan_range[(‘BW0061000000’,var3,‘03’,min),(‘BW0061000000’,var3,‘04’,min))
23 #TAB3KUP2: [1, 1, 0]; TABXXXINDEX2(TABX)
24 #SSEK2: [1, 1, 0]; scan_type(ASC), TABXXXINDEX2(TABXXX as TABX), scan_range[T.TAB1ID,T.TAB1ID]
Cost由12833降低到7270,执行时间由150秒降低到11秒。

社区地址:https://eco.dameng.com

达梦数据库sql优化实践2相关推荐

  1. 达梦数据库-SQL优化之HINT-平坦化处理

    1.HINT之OUTER_JOIN_FLATING_FLAG (1).解释: Flag of indicating whether outer join will be flattened. 对左外连 ...

  2. java获取达梦数据库_记一次对达梦数据库的优化过程

    某年某月某日的一个下午,接收到监控服务器的一条告警短信: 尊敬的运维工程师 XX,你好: "192.168.136.200"数据库服务器 CPU 异常,CPU 使用率 98.7%, ...

  3. oracle向达梦迁移工作量,从Oracle安全移植到国产达梦数据库的DBA实践

    随着我国对信息安全和自主可控技术的日益重视,国产数据库在党政机关.军队和大型央企等行业中得到了快速应用.达梦数据库(以下简称DM)是国内数据库行业领军企业--达梦推出的一款自主可控的高性能数据库产品. ...

  4. 达梦查询sql优化几种方式

    问题描述 在近做项目的过程中遇到了达梦查询sql 性能过慢问题,把平常在MySQL和Oracle中一些优化方法拿到达梦这边来使用,发现效果是比较小的,最终通过查阅资料发现了达梦优化sql的方式和MyS ...

  5. 达梦数据库SQL学习

    数据来源于达梦数据库安装实例时的示例库DMHR 一 分组函数 分组函数做用于一组数据.并对于一组数据返回一个值 常见的分组函数:(聚合函数) AYG.COUNT.MAX.MIN.SUM... sele ...

  6. 达梦数据库SQL日志分析工具Dmlog的使用

    1.使用条件 运行环境预先安装Java环境:支持liunx和windows系统运行. 说明:推荐使用java1.8版本,linux最小化安装最少要安装打印服务组件,windows下不支持java1.6 ...

  7. 【与达梦同行】达梦数据库SQL去掉sort

    SQL优化是一个比较复杂的事情,想要做好优化一要靠扎实的技术功底,二要靠丰富的实践经验,这里来谈一下SQL优化中的sort优化问题. 在之前的优化经验中,错误的任务只要结果集不大,含有order by ...

  8. 达梦数据库SQL调优,查看执行计划、ET

    一.调优目标 SQL 调优的整体目标是使用最优的执行计划,使IO以及CPU代价最小.调优主要关注下列方面: ·表扫描 如果计划中对某大表使用了全索引扫描,那么需要关注该表是否存在某个查询条件使得过滤后 ...

  9. 达梦数据库 sql使用学习

    1.项目里用了DATE_SUB.DATE_ADD也没有报错,是可以用的. a. 使用INTERVAL时,达梦要给时间加' ',例:INTERVAL '1' DAY; b. 如果INTERVAL的时间是 ...

最新文章

  1. AI颠覆经济世界作用被夸大?影响远比媒体头条报道更加复杂
  2. 英特尔SVT-AV1 0.8 AV1视频编码基准发布
  3. MySQL查询时构建自增ID
  4. SAP 电商云 Spartacus UI 从 CMS 取回 slots 和 component 之后的处理
  5. 汇编中16进制的写法问题
  6. mysql行格式_MySQL 行格式
  7. 定时任务getScheduler
  8. Windows下PyMC安装
  9. Android 存储学习之SQLite数据库的基本操作
  10. 一个Windows C++的线程池类实现
  11. 【数字电路逻辑设计】第1章 基本知识
  12. Android半透明
  13. php实现电脑自动关机,如何设置定时关电脑?三种方法教你设置电脑自动关机
  14. 记录--Spyder打开时出现“An error occurred while starting the kernel“
  15. OpenMV学习(0):环境搭配
  16. 计算机编程英语发音,计算机编程常用英语
  17. python代码画樱花-python画樱花树代码 具体代码介绍
  18. 2019互联网企业排名
  19. java工作流框架jbpm_【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
  20. tms web core 与 kbmmw 第一次亲密接触

热门文章

  1. delphi中常见错误提示说明总结
  2. 【差分约束】 HDOJ 1529 Cashier Employment
  3. 开学季学生党买什么蓝牙耳机好?高性价比无线蓝牙耳机推荐
  4. 2020重庆市教育局网络安全攻防比赛——密码学
  5. Archery Tournament
  6. 饥荒服务器票据哪里是最新的,饥荒TGP版洞穴服务器搭建图文教程
  7. 王唯佳被南开计算机学院录取,662分!庞贝病少年王唯佳被南开大学录取
  8. System.Diagnostics.Process.Start 用法
  9. 编写代码、打印图4-2所示的图形python_Python之turtle库画各种有趣的图及源码(更新中)_一个超会写Bug的程序猿的博客-CSDN博客...
  10. 【AI周报】首款高容错通用量子计算机原型登上Nature;SIGIR 2022 | 快手联合武汉大学提出序列推荐的多粒度神经模型