首页 > 数据库 >达梦数据库系列—44.SQL调优

达梦数据库系列—44.SQL调优

时间:2024-08-02 15:53:07浏览次数:13  
标签:MONITOR 44 索引 调优 USER SQL 优化 ID

目录

SQL优化思路

1、定位慢sql

2、SQL分析方法

2.1 执行计划

2.2 ET 工具

2.3 dbms_sqltune 工具

3、SQL语句优化

3.1 索引

3.2 SQL语句改写

3.3 表设计优化

3.4 表的连接方式

3.5 HINT

4、统计信息


SQL优化思路

1、定位慢sql

待优化的SQL大致可分为两类:

1、SQL 执行时间在十几秒到数十秒之间,但执行频率不高,此类 SQL 对数据库整体性能影响并不大,可以放到最后进行优化。

2、SQL 单独执行时间可能很快,在几百毫秒到几秒之间,但执行频率非常高,甚至达到每秒上百次,高并发下执行效率降低,很可能导致系统瘫痪,此类 SQL 是优化的首要对象。

定位慢sql的两种方法:

  1. 开启跟踪日志,见“日志总结-SQL日志”
  2. 通过系统视图查看,见“常用SQL-sql相关”

2、SQL分析方法

2.1 执行计划

达梦数据库系列-40.执行计划

2.2 ET 工具

ET 功能默认关闭,可通过配置 INI 参数中的 ENABLE_MONITOR=1、MONITOR_SQL_EXEC=1 开启该功能。

--两个参数均为动态参数,可直接调用系统函数进行修改

SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);

SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);

--会话级别修改只在当前会话生效

SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);

--关闭 ET

SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',0);

SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',0);

执行 SQL 语句后,客户端会返回 SQL 语句的执行号。单击执行号即可查看 SQL 语句对应的 ET 结果。

如果没有图形界面,调用存储过程可返回相同结果。

  • OP: 操作符
  • TIME(us): 时间开销,单位为微秒
  • PERCENT: 执行时间占总时间百分比
  • RANK: 执行时间耗时排序
  • SEQ: 执行计划节点号
  • N_ENTER: 进入次数

2.3 dbms_sqltune 工具

使用前提:建议会话级开启参数 MONITOR_SQL_EXEC=1

ALTER SESSION SET 'MONITOR_SQL_EXEC' = 1;

<执行待优化SQL>

select DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=>1213701) from dual;

3、SQL语句优化

3.1 索引

索引存储结构

从B*树中访问每个叶子节点的成本都是h次IO,索引的访问效率只跟B*树的高度有关系。

以下场景可考虑创建索引:

  • 仅当要通过索引访问表中很少的一部分行(1%~20%)。
  • 索引可覆盖查询所需的所有列,不需额外去访问表。

组合索引的顺序:

  •  最优先把等值匹配的列放最前面,范围匹配的放后面
  •  其次把过滤性好的列放前面,过滤性差的放后面
  •  查询时组合索引只能利用一个非等值字段

存在下列情况将导致无法使用索引:

  • 条件列不是索引的首列
  • 条件列上有函数或计算
  • 存在隐式类型转换
  • 如果走索引会更慢

建立索引的原则:

  • 建立唯一索引。唯一索引能够更快速地帮助我们进行数据定位;
  • 为经常需要进行查询操作的字段建立索引;
  • 对经常需要进行排序、分组以及联合操作的字段建立索引;
  • 在建立索引的时候,要考虑索引的最左匹配原则(在使用 SQL 语句时,如果 where 部分的条件不符合最左匹配原则,可能导致索引失效,或者不能完全发挥建立的索引的功效);
  • 不要建立过多的索引。因为索引本身会占用存储空间;
  • 如果建立的单个索引查询数据很多,查询得到的数据的区分度不大,则考虑建立合适的联合索引;
  • 尽量考虑字段值长度较短的字段建立索引,如果字段值太长,会降低索引的效率。

3.2 SQL语句改写

优化 GROUP BY

在 GROUP BY 之前过滤掉不需要的内容

--优化前

SELECT JOB,AVG(AGE) FROM TEMP GROUP BY JOB HAVING JOB = 'STUDENT' OR JOB = 'MANAGER';

--优化后

SELECT JOB,AVG(AGE) FROM TEMP WHERE JOB = 'STUDENT' OR JOB = 'MANAGER' GROUP BY JOB;

用 EXISTS 替换 DISTINCT

--优化前

SELECT DISTINCT USER_ID,BILL_ID FROM USER_TAB1 D,USER_TAB2 E WHERE D.USER_ID= E.USER_ID;

--优化后

SELECT USER_ID,BILL_ID FROM USER_TAB1 D WHERE EXISTS(SELECT 1 FROM USER_TAB2 E WHERE E.USER_ID= D.USER_ID);

用 WHERE 子句替换 HAVING 子句

用 UNION ALL 替换 UNION

用 TRUNCATE 替换 DELETE

用 EXISTS 替换 IN、用 NOT EXISTS 替换 NOT IN

3.3 表设计优化

水平分区表

见“分区表”

全局临时表

事务型临时表

创建指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除

CREATE TEMPORARY TABLE TEMP_COMM (C1 INT,C2 INT,C3 DATETIME) ON COMMIT DELETE ROWS;

会话型临时表

创建指定临时表是会话级的,会话结束时才清空表;

CREATE TEMPORARY TABLE TEMP_SESS (C1 INT,C2 INT,C3 DATETIME) ON COMMIT PRESERVE ROWS;

3.4 表的连接方式

达梦数据库系列-41.表连接方式

3.5 HINT

达梦数据库系列-43.HINT

4、统计信息

达梦数据库系列-39.统计信息详解

达梦技术社区:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

标签:MONITOR,44,索引,调优,USER,SQL,优化,ID
From: https://blog.csdn.net/md54333/article/details/140872023

相关文章

  • Springboot Docker Redis Mysql集成
    尽管网上关于SpringbootDockerRedisMysql集成的文档很多,但是很多都是老文档,问题不少,所以我专门整理了这份文档。我家里的笔记本是mac,所以我就在mac上详细说明下我的搭建过程。首先我们需要安装docker,mac上本来就有docker的安装包,因此对于mac来说,安装docker就是一件比较轻松的......
  • MySQL:初识数据库&初识SQL&创建数据库
    目录1、初识数据库1.1什么是数据库1.2 什么是MySQL2、数据库2.1 数据库服务&数据库2.2C/S架构3、初识SQL3.1什么是SQL3.2 SQL分类 4、使用SQL4.1查看所有数据库4.1.2语句解析 4.2创建数据库4.2.1 ifnotexists校验 4.2.2手动明确字符集和排序规......
  • 基于Java+SpringBoot+Mysql+Vue实现的4S店保养与维修系统部分功能设计与实现八
    一、前言介绍:1.1项目摘要随着社会经济的不断发展,人们对汽车养护和维修的重视程度日益提高。然而,传统的汽车保养与维修服务存在诸多问题,如信息不对称、服务质量参差不齐等。这些问题不仅影响了消费者的服务体验,也制约了汽车后市场的健康发展。因此,为了解决这些问题,提升汽......
  • 基于Java+SpringBoot+Mysql+Vue实现的4S店保养与维修系统部分功能设计与实现九
    一、前言介绍:1.1项目摘要随着社会经济的不断发展,人们对汽车养护和维修的重视程度日益提高。然而,传统的汽车保养与维修服务存在诸多问题,如信息不对称、服务质量参差不齐等。这些问题不仅影响了消费者的服务体验,也制约了汽车后市场的健康发展。因此,为了解决这些问题,提升汽......
  • sql更新数据库表的某一字段每条记录的随机数
    sql更更新数据库表的某一字段每条记录的随机数(6位随机数)使用游标实现,以下代码在SQL里执行即可--声明游标DECLARE@user_idvarchar(36)DECLAREuser_extension_cursorCURSORFORSELECTid--表里唯一识别ID(改为自己表里的字段名)FROM[test].[dbo].[my_table]--表名......
  • sqli-labs-master less1-less6
    目录通关前必看1、判断是否存在sql注入以及是字符型还是数值型:2、各种注入方式以及方法有回显型:报错注入(只有'ok'和'no'的提示以及报错提示):详细思路,后面的题都可以这样去思考关卡实操less1less2less3less4less5less6通关前必看在这之前,需要掌握数据库的基本......
  • 【原创】java+ssm+mysql图书信息管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:随着数字化和信息化技术的飞速发展,传统的图书馆管理方式已经逐渐不能满足现代社会的需求。数字化技术为......
  • P4544 [USACO10NOV] Buying Feed G
    思路:考虑动态规划算法。定义\(dp_{i,j}\)表示达到第\(i\)家商店时共买了\(j\)吨饲料的最小花费,那么我们可以枚举到达上一家店的饲料数\(k\):\[dp_{i,j}=(x_i-x_{i-1})\timesj^2+\min\limits_{k=j-f_{i-1}}^jdp_{i-1,k}+c_{i-1}\times(j-k)\]可以将和\(i-1\)......
  • Mysql索引详解
    1索引1.1索引概述索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。1.1.1特点索引......
  • SQL SERVER跨服务器查询
    执行存储过程sp_addlinkedserver以将服务器添加到sys.servers。--server124为远程服务器的别名execsp_addlinkedserver'server124','','SQLOLEDB','远程服务器名或ip地址'execsp_addlinkedsrvlogin'server124','false',null,......