达梦8数据库性能优化思路浅谈

这篇具有很好参考价值的文章主要介绍了达梦8数据库性能优化思路浅谈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SQL优化的重要性

    作为一名DBA,SQL优化是我们工作中必不可少的技能,在投产的系统中,存在大量的SQL语句需要我们分析和快速做出处理。很是考验我们的经验。这些慢SQL的原因有很多,有SQL编码不规范,设计有缺陷,SQL场景未考虑全面,数据量未评估等,预先需要建立索引的表而未设计建立,需分表分区的未进行拆解,也有环境因素造成的缺陷。也有出厂测试之前没有问题,但实际部署到客户现场时候却出了问题。这些异常语句,如果不及时处理,会造成对数据库的一个性能瓶颈,直接影响着目标用户的使用和体验。所以数据库SQL的性能优化,快速处理显得尤为重要。

文章目标,希望读者掌握达梦SQL优化的基础,SQL性能分析思路,参数配置标准工艺化理念,性能辅助工具熟练应用。文章最后7,8章也整合了第三方的常见分析工具,辅助达梦数据库性能压测时候的一种分析手段。文章中没有过多对单个SQL性能优化深入讲解,主要原因还是部分SQL涉及公司代码不便发布,其次也是个人能力有限,也是在不断学习中。

  • 预估执行计划生成及基础说明

我们以达梦8数据库为例,拿到一条SQL的时候,首先要下达梦手册中提出的有效SQL规范,及是否命中了特殊OR子句的不规范,是否用了复杂的正则表达式,避免重复很高的索引,UINON ALL 是否可以替换UNION操作等,某些场景INSTR函数导致的NEST LOOP效率等,再就是看下它的预估执行计划。预估执行计划,我们可以采用达梦客户端点击如下图解小按钮生成,也可以按快捷键F9生成,也可以在SQL前加EXPLAIN生成预估计划;

2.1、生成预估执行计划

达梦客户端直接点击菜单栏按钮或按F9生成:

达梦8数据库性能优化思路浅谈

 

执行EXPLAIN SELECT * FROM TEST_TAB1 WHERE DXID=11487150 生成:

达梦8数据库性能优化思路浅谈

 

2.2、操作符讲解

执行计划操作符,大家起初可能并不熟悉,这个可以参考达梦官方手册:DM8 DBA.pdf ,在附录3有执行计划操作符说明。常见操作符,需要掌握,比如:聚集索引扫描(CSCN2),全表扫描(CSCN),索引扫描(SSEK),二次回表(BLKUP),除重(DISTINCT) ,二级索引定位(SSEK2)等等;多表关联,我们通常会遇到:(HASH链接)HASH JOIN,嵌套循环连接(NEST LOOP JOIN),

还有MERGE 链接(MERGE JOIN );

大表和大表关联主要HASH JOIN更优,而如果小表和大表关联,通常是NEST LOOP JOIN会更优,实际情况都是和数据量有关,优化器大部分能选择到合适的操作符,少数情况需要人为干涉。

2.4、执行计划顺序讲解

执行计划我们可以理解是一个树型状,看懂执行计划顺序,会让我们更好的分析SQL性能问题,通常执行计划查看,大家可以在达梦客户端选择表格展示或文本方式,看执行顺序表格会更直观,分析执行计划,文本更适合,但是SQL的执行顺序,并不是简单的从下而上,她的解析是要遵守规律,具体大家可以这样理解:

  1. 缩进越深的越先执行;
  2. 同样缩进的上面的先执行,下面的后执行;

3、上下的优先级高于内外;

如上说明还是不够直观,我再图解一个样例让大家理解:

达梦8数据库性能优化思路浅谈

 

说明:越缩进越先执行,即最终缩进分叉了3,4,同样的缩进,从上由下优先级更高,所以这里的3先执行,3下面又有越深的越先执执行,又有1,2 ,所以整个排序执行顺序就出来了,开始看不习惯,大家多看几次就习惯了。

三、达梦性能分析思路

达梦数据库的优化,我平常使用的最多的还是,达梦数据库优化“三把斧”,在实践中发现可以排除93%(百分比数值只是个人以往解决性能问题的估算百分比)以上的性能问题,我说的三把斧主要三个方面(统计信息收集,合理的索引建立,DM.ini参数的优化),在使用三把斧过程中,我们首先要预检查下SQL,以及SQL编写的初级错误问题,例如:OR语句,困难正则表达式,未加过滤条件,笛卡尔,隐式转换,简单先过一遍。

在实际过程中,大部分SQL优化可以通过收集统计信息,索引新增,索引调整,达梦DM.INI参数调整等得到优化处理,而进阶一些的比较难分析的,就涉及到了增加HINT,SQL改写,在处理过程中,都需要根据具体SQL来判断,常见的有关联临时表查询,层次查询等容易需要Hint辅助,文章中给出浅显的例子来说明,实际优化过程中,还是需要不断的去实践,根据不同的SQL,分析执行计划,这样才能积累更加丰富的经验。

3.1、统计信息收集基础讲解

达梦数据库是基于代价的优化器,达梦数据库统计信息不准,会影响到执行计划的估算,导致SQL解析到错误的执行计划,如何判断统计信息有没有收集呢?

我们看如下SQL,主要看NUM_ROWS字段,如果没有收集通常是空,第二个LAST_ANALYZED 代表收集的时间,如果没有收集这个字段也是空,第三个TEMPORARY字段附带说明,N表示不是临时表,Y表示是临时表,通常如果TEMPORARY=Y 是不用收集的,

这个大家查询的时候注意下,临时表无需收集统计信息;

用例讲解:

SELECT NUM_ROWS,LAST_ANALYZED,TEMPORARY 

   FROM USER_TABLES WHERE TABLE_NAME='TEST_TAB1';

我们需要对表进行查询,查询语句如下:

达梦8数据库性能优化思路浅谈

 

当一个表缺失了统计信息我通常用如下语句修复:

BEGIN

DBMS_STATS.GATHER_TABLE_STATS(USER,'TEST_TAB1',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); 

END;

DBMS_STATS.GATHER_TABLE_STATS参数说明:

以上参数注释:

第一个参数:USER是所属用户,如果你要指定其它用户,单独填写,默认USER是当前用户下的表;

第二个参数:就是你所要收集的表;

第三个参数:一般不是分区表名填写NULL即可,默认也是 NULL,区分大小写

第四个参数:采样百分比,收集的百分比,范围为 0.000001~100,默认系统自定;第五个参数:TRUE,保留参数,是否使用随机块代替随机行,默认我们填写 TRUE即可,第六个参数:控制列的统计信息集合和直方图的创建的格式默认我们填写FOR ALL  COLUMNS SIZE AUTO即可,表示所有列收集,需要深入理解的可以参考达梦官方手册:DM8 - System Packages.pdf,平常我比较常用的还是DBMS_STATS.GATHER_TABLE_STATS其次官方也提供了一些函数;

3.2、统计信息收集简单案例

什么时候需要收集统计信息?

    通常执行计划估算数据量不准的时候就需要收集了,相差不大一般没有影响,如果比较大就要收集了,否则会影响性能;这里用以下例子说明,只是对表未收集统计信息导致执行计划估算有差异的案例:

--步骤1:直接创建2个表,一般新创建的表统计信息是不会自动收集的(否则开启AUTO_STAT_OBJ全表监控的自动收集),我们查一下它的执行计划,这个时候结果集应该是估算有差异的;

CREATE TABLE  TEST1208_1 AS 

select * from dba_TAB_COLUMNS  WHERE TABLE_NAME='ALL_ALL_TABLES';

CREATE TABLE  TEST1208_2 AS

select * from dba_TAB_COLUMNS  WHERE TABLE_NAME='ALL_ALL_TABLES';

--客户端按F9,查看预估执行计划:

达梦8数据库性能优化思路浅谈

 

步骤2:获取真实执行计划:

DISQL登录当前用户

E:\dmdbms\bin>DISQL SYSDBA/SYSDBA_PWD@127.0.0.1

然后执行如下命令:

ALTER SESSION SET 'MONITOR_SQL_EXEC'=1;

set autotrace trace;

SELECT A.COLUMN_NAME FROM TEST1208_1 A ,TEST1208_2 B WHERE A.COLUMN_NAME=B.COLUMN_NAME;

达梦8数据库性能优化思路浅谈

 

最后展示服务端执行计划:

达梦8数据库性能优化思路浅谈

 

从服务器上的执行计划这里可以看出,实际56,估算174;

步骤3:达梦客户端,我们对这连个表统计信息进行收集;

BEGIN

DBMS_STATS.GATHER_TABLE_STATS(USER,'TEST1208_1',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); 

DBMS_STATS.GATHER_TABLE_STATS(USER,'TEST1208_2',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); 

END;

/

步骤4:客户端F9,我们再来看预估执行计划:

达梦8数据库性能优化思路浅谈

 

收集统计信息后,预估执行计划是已经正确了;

步骤5:我们重复步骤2看真实SQL计划,那继续再看收集统计信息后执行计划情况:

达梦8数据库性能优化思路浅谈

 

发现并没有变化,这是为什么呢?

我们思考一下就会想到,因为之前在未收集统计信息的时候,我们执行了一遍这个SQL,所以SQL缓存了计划,那遇到这样的情况,我们应该对这个SQL的缓存计划进行清理;

步骤6,清理方法如下:

数值1034139736是通过SELECT * FROM v$cachepln where SQLSTR LIKE 文章来源地址https://www.toymoban.com/news/detail-460783.html

到了这里,关于达梦8数据库性能优化思路浅谈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)

    对数据库架构进行优化是为了提高数据库系统的性能、可扩展性、稳定性和可维护性。MySQL官方说:单表2000万数据,性能就达到瓶颈了,为了保证查询效率需要让每张表的大小得到控制。 再来说,为什么要提高查询效率呢? 除了普通的用户查询操作,增、删、改操作都包含

    2024年02月11日
    浏览(31)
  • MySQL数据库内存配置与性能优化:合理分配内存,提升数据库性能

             引言 :MySQL是广泛使用的关系型数据库管理系统,而合理配置数据库的内存是保障其高性能运行的关键之一.本文将介绍如何根据MySQL数据库内存值大小来定义,以及这样配置如何影响数据库的性能   内存配置的基本原则 : innodb_buffer_pool_size :该参数定义了InnoDB存储引擎

    2024年02月22日
    浏览(39)
  • 【性能优化】MySql数据库查询优化方案

    了解系统运行效率提升的整体解决思路和方向 学会MySQl中进行数据库查询优化的步骤 学会看慢查询、执行计划、进行性能分析、调优 ​关于这个问题,我们通常首先考虑的是硬件升级,毕竟服务器的内存、CPU、磁盘IO速度 、网络速度等都是制约我们系统快慢的首要因素。硬

    2024年02月03日
    浏览(44)
  • MongoDB 数据库性能优化技巧

    原文:MongoDB 数据库性能优化技巧 (techdatafuture.com) MongoDB 是一款灵活且可扩展的NoSQL数据库,为了提高其性能,我们可以采取一些优化技巧。本文将介绍一些MongoDB性能优化的关键点,包括索引的使用、查询优化、数据模型设计和硬件优化等。          1.合理使用索引     索

    2024年02月09日
    浏览(55)
  • 数据库性能优化的基本方法

    一、基本方法 数据库表结构优化。优化表结构,避免过度冗余设计和数据重复。 索引优化。根据查询需求,建立合适的索引,提高查询速度。 查询语句优化。编写高效的查询语句,避免全表扫描和子查询,减少 JOIN 操作。 数据库缓存优化。使用缓存技术,将频繁访问的数据

    2024年02月15日
    浏览(47)
  • Oracle 数据库表性能优化

    最近在一次工作过程中,遇到了oralce 表性能慢的问题。一个历史表,一个月将近1000多万的数据量,想查询这个表的数据,只使用了一个简单的语句,却一个多小时都查不出来。于是决定对Oracle 的这张表的性能进行一下优化。本人不是一个专门搞数据库这块的dba,所以只能粗

    2024年02月03日
    浏览(39)
  • MySQL数据库性能优化技巧介绍

    MySQL是目前最流行和广泛使用的开源关系型数据库之一,随着数据量的增长和访问负载的提高,优化数据库性能变得至关重要,以确保系统能够高效地处理大量的并发请求。本文将记录一些MySQL数据库性能优化的技巧,提高数据库的运行效率,提升系统性能。 对于MySQL,最简单

    2024年02月08日
    浏览(90)
  • 顶级大厂Quora如何优化数据库性能?

    Quora 的流量涉及大量阅读而非写入,一直致力于优化读和数据量而非写。 读取 数据量 写入 ① 复杂查询,如连接、聚合等 在查询计数已成为问题的情况下,它们在另一个表中构建了计数,以便它们可以直接读取计数值而非计算计数。 ② 大型扫描 他们使用 LIMIT 改变它或使用

    2024年02月05日
    浏览(33)
  • 数据库——MySQL高性能优化规范

    所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留(如果表名中包含查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符 临时库表必须以 tmp_为前缀并以日期为后缀,

    2024年02月11日
    浏览(85)
  • 数据库优化系列教程(2)—性能评估和监控

            这一步骤对于数据库优化至关重要。性能评估帮助我们深入了解当前系统的运行状况,而监控系统则确保我们能够实时了解数据库的性能变化。及时的评估和监控有助于快速识别和解决潜在问题,确保数据库系统能够稳定高效地运行。         在性能评估中,

    2024年01月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包