达梦8数据库优化

news2024/11/15 21:35:29

1.什么是执行计划?

一条SQL语句在数据库中执行过程或访问路径的描述。

2.如何查看达梦数据库执行计划?

通过explain命令:

EXPLAIN +执行的SQL语句,如

SQL> EXPLAIN SELECT * FROM TEST1;

1   #NSET2: [1, 1113, 602] 
2     #PRJT2: [1, 1113, 602]; exp_num(16), is_atom(FALSE) 
3       #CSCN2: [1, 1113, 602]; INDEX33555810(TEST1)

已用时间: 0.810(毫秒). 执行号:0.

图形工具展示:

执行顺序:从里到外,从右到左/从下到上

执行计划包含内容:

一个执行计划包含若干个计划节点,上图1,2,3

每个计划节点中包含操作符(CSCN2)和它的代价(1,1113,602)等信息

代价是由一个三元组组成【代价,记录行数,字节数】

  代价单位是毫秒,记录行数表示计划节点输出的行数,字节数表示该计划节点输出的字节数

此执行计划解读:操作符CSCN2全表扫描,代价估算是1ms,扫描行数1113行,输出字节602个。

3.常见操作符

 收集结果集:NSET 用于结果集收集操作符,也就是查询计划的顶层节点。

投影:PRJT 关系的“投影”(project)运算,用于选择表达式项的计算,如果头像耗时大一般跟子查询有关。

选择:SLCT 关系的“选择”(select)运算,用于查询条件的过滤。

简单聚集:AAGR 用于没有group by 的count sum age max min等聚集函数的计算。

快速聚集:FAGR用于没有过滤条件时从表或者索引快速获取MAX/MIN/COUNT值。

HASH分组聚集:HAGR用于分组列没有索引只能走全表扫描的分组聚集,分组的列没有索引。

流分组聚集:SAGR 用于分组列是有序情况下,可以使用流分组聚集,条件列已经有索引:SAGR性能优于HAGR

二次扫描:BLKUP先使用二级索引定位,在根据表的主键、聚集索引、ROWID等信息等位数据行。

全表扫描:CSCN是cluster index scan的缩写通过聚集索引扫描全表,全表扫描是最基本的查询,如果没有为此过滤或者索引则系统一般只能进行全表扫描。生产环境避免全表扫描。

索引扫描:SSEK CSEK SSCN

SSEK二级索引扫描,先扫描索引,在通过主键、聚集索引、ROWID等信息去扫描表 

CSEK聚集索引扫描,只扫描索引,不需要扫描表

SSCN是索引的全扫描,不需要扫描表

4.表连接

嵌套循环连接(NEST LOOP)

两层嵌套循环结构,有驱动表和被驱动表之分,选定一张表作为驱动表,遍历驱动表中的每一行,根据条件去匹配第二张表的行。驱动表满足条件的行数就是循环的次数。

建议:小表作为驱动表,驱动表有好的过滤条件,表连接条件有索引,结果集比较小的场景使用。

hint强制走嵌套 /*+use_nl(tab1,tab2) */

哈希连接(HASH JOIN)

一般没有索引或索引用不上的情况使用该连接,选择小表做HASH表,以一张表的连接列为哈希键,构造哈希表,另张表的连接列进行哈希探测,找到满足条件的记录。由于哈希命中率高,因
此,在大数据量情况下,哈希连接的效率较高。哈希连接的代价是建立哈希表和哈希探测的代价只能适用于等值连接。HASH连接比较消耗内存。

如果系统有很多这种连接时,需调整以下3个参数:

HJ_BUF_GLOBAL_SIZE

HJ_BUF_SIZE

HJ_BLK_SIZE

归并连接(MERGE SORT)

无驱动表之分,随机读很少,两个表都需要按照连接列进行排序,需要消耗大量的CPU和额外额内存。如果查询列属于索引的子集,CBO就会优先考虑这种连接方式。

hint强制走归并/*+use_merge(tab1,tab2)*/

5.查询转换

  查询转换是优化器自动做额,在生产执行计划之前,等价改写查询语句的形式,以便提升效率和产生更好的执行计划。它决定是否重写用户的查询,常见的转换有谓词传递、视图拆分、谓词推进、关联/非关联子查询改写等。了解优化器查询的特性,会帮助我们更好的看懂执行计划,也会对我们优化SQL起到指导作用。优化器的查询转换有很多限制条件,我们可以根据类似原理举一反三,进行手工SQL改写,从而得到更好的执行计划。

谓词传递:根据A=B,B=C

select * from a inner join b on a.c1=b.c1 where a.c2=100 and a.c2=b.c2;

--CBO转换后

select * from a inner join b on a.c1=b.c1 where a.c2=100 and a.c2=b.c2 and b.c2=100;

视图拆分:视图与表关联中将视图查询的计划拆分与表合成一个整体执行计划。优化器等价改写,将视图查询拆散了,和其它的部分作为一个整体来生成计划。视图拆分有很多限制,如果视图中包含了distinc、union、group by 等操作,优化器无法将视图拆分。SQL中如果使用过多的视图,会使SQL变得复杂,优化器也难以生成最佳的执行计划,不能过度依赖优化器进行视图拆分,开发时应减少视图的使用。

谓词推进:子查询字段无索引,本应该走全表扫描,但是子查询却走了另一个字段的索引,优化器对等价改写把索引的条件列推入到子查询中。如下:

原始SQL:子查询X相当于内联视图

select * from (select a1,a2 from t where a1=2) x where a2=20;

查询转换

select * from (select a1,a2 from t where a1=2 and a2=20 ) x;

非关联子查询的转换:子查询跟另一张表查询列无关联,完全可以把它生成独立的子计划,但是计划中却和另一个表做了关联,优化器进行了等价改写。如下:

原始SQL:select * from a where a1 in (select b1 from b) and a2='D';

查询转换:select * from a where exists (select 1 from b where a.a1=b.b1) and a2='D';

INI参数: REFED_EXISTS_OPT_FLAG,影响in和exists子查询的转换

外连接转换:SQL写法是外连接,执行计划却变成了内连接,说明优化器进行等价改写。例如:

原始SQL:select a.a1,b.b1 from a left join b on a.a1=b.b1 where b.b1=100 and a.a2='A';

查询转换:select a.a1,b.b1 from a inner join b on a.a1=b.b1 where b.b1=100 and a.a2='A';

6.统计信息

统计信息主要描述数据库中标,索引的大小,规模,数据分布情况等一类信息,如:表的行数、块数,评价每行的大小,索引的高度、叶子节点数,索引字段的行数,不同值得大小等。

有两种类型的直方图:频率直方图和等高直方图。

根据算法分析表的数据分布特征(以不同值的数据量1 万个为分界线),确定直方图的类型。

频率直方图的每个桶(保存统计信息的对象)的高度不同,等高直方图每个桶的高度相同。生成直方图时,如果不同值少于 1 万个则用频率直方图,否则用等高直方图。

统计信息作用:在执行查询时,如果数据对象存在统计信息,代价算法可以根据统计信息中的数据,比较精确地计算出操作所需花费的成本,以此来确定连接方式、对象访问路径、连接顺序,选
择最优的执行计划。

如果没有对基数低的列收集直方图统计信息,基于成本的优化器(CBO)会认为该列数据分布是均衡的,返回结果无论多少有可能都是走索引,导致执行计划错误。当列出现在 where 条件中,列的选择性小于 1%并且该列没有收集过直方图,这样的列就应该收集直方图。注意:千万不能对没有出现在 where 条件中的列收集直方图。对没有出现在 where 条件中的列收集直方图完全是做无用功,浪费数据库资源。

一般对小于 1GB 的表进行 100%采样,因为表很小,即使 100%采样速度也比较快。有时候小表有可能数据分布不均衡,如果没有 100%采样,可能会导致统计信息不准。因此建议对小表 100%采样。
一般对表大小在 1GB~5GB 的表采样 50%,对大于 5GB 的表采样 30%。如果表特别大,有几十甚至上百 GB,我们建议应该先对表进行分区,然后分别对每个分区收集统计信息。一般情况下,为了确保统计信息比较准确,建议采样率不要低于 30%。

7.不走索引的情况

A.条件列非复核索引的首列;

B.条件列上有函数或者计算(可以建立函数索引,不建议大规模使用);

C.存在隐式转换(建议数据类型最好匹配);

D.如果走索引会更慢(返回记录较多不走索引,返回记录少走索引,一般因为统计信息的不准确导致)

E.没有统计信息或者统计信息过期(目前达梦无法查看统计信息过期)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue笔记01 模板语法,数据代理,事件处理,计算监听属性,绑定样式,列表渲染,数据监测

基本使用 引入vue 创建vue实例并关联容器 一个Vue实例只应对应一个容器 一个Vue实例可以有多个组件 模板语法 使用Vue实例中数据 root容器中代码被称为vue模板 语法分为插值语法和指令(v-xxx) 插值语法 绑定标签体内容 {{}}中的可以是js表达式(特殊的js代码&…

CF790 div4 F(双指针) H(逆序对)

乐,被div4薄纱了没想到把所有出现次数>k的数放一个数组里然后双指针还有H,连逆序对都没看出来,嘻感觉以后还是写写div4算了,写什么div2啊,caibiProblem - F - Codeforces题意:给定一个数列,长…

2023万象更新!smardaten企业级无代码新版本也来啦!

2022可以说是在反复的做核酸、查绿码中度过的,不曾想年终一个月还是躲不过“小阳人”的命运。而这一个月,研发部的“阳过”们依旧加班加点给我们带来了最新版本——V8R4C70。在2022-2023跨年之际,smardaten这次又有哪些新的变化呢&#xff0c…

MVC三层架构的模式

大家好,今天给大家分享一下MVC 三层架构的模式 首先你要知道,所谓的MVC就是一种面向于javaee企业级开发的设计模式 这里要强调一点,MVC 不是一种技术,不是一种像spring 那样的框架,它是一种思想(可以理解为一种解决问…

【GNSS算法工程入门】1. Git入门

写在前面笔者在GNSS算法开发岗位从业过一段时间,和大部分同学类似,在GNSS开发过程中,也是从工程化的小白逐渐成长起来。而在算法开发从业的过程中,发现有些基础的知识其实在学校学习过程中是相对缺失的。麻省理工有个课程叫计算机…

编译型语言的Docker镜像构建小技巧

最近公司需要将一个底层服务打包成docker镜像,作为征战docker一年的小白当然不能错过这次练手的好机会。简单介绍一下这个项目:该项目为一个纯restful风格的后端项目,后端由java开发、worker节点由python开发、管理员使用的命令行工具由rust开…

wpa_supplicant EAP状态机分析

EAP状态机分析RFC4137协议状态机设计原理模块划分SM状态定义SM状态转换SM使用到的变量及函数定义变量1.SM与LL交互使用到的变量列表2.SM与EM交互使用到的变量3.SM内部使用的变量函数wpas代码RFC4137协议 RFC4137:“State Machine for Extensible Authentication Pr…

强化学习笔记-01多臂老虎机问题

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考。 1. 多臂老虎机问题 多臂老虎机问题是指存在K个老虎机,每个老虎机的获胜金额是一个未知的概率分布且相互独立,假设…

一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子

Opencv四大算子 Sobel算子Scharr算子laplacian算子canny算子总结边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要的作用! Sobel算子 sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越…

python链接池和pymysql批量入库——从0实现大规模异步爬虫框架项目4

我将这个链接池和批量入库封装了一个工具类上传了pypi,可以直接import使用 使用也较为简单,导入PooledDBhelper的DBhelper,调用DBhelper.PooledDBhelper()方法传入数据库链接信息创建一个链接池即可 pip install PooledDBhelper1.0.0 -----------------…

虚析构函数的作用

类的析构函数是为了释放内存资源,析构函数不被调用的话就会造成内存泄漏。虚析构函数定义为虚析构函数是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。但并不是要把所有类的析构函数都写成虚函数。只有当一个类被用来作为基…

信息论复习—卷积码

目录 卷积码的基本概念: 卷积码与分组码的不同特点: 卷积码的构造与表示方法: 卷积码编码器的结构: 卷积码(3,1,3): 卷积码的卷积关系: 卷积码的生成矩阵: 卷积码的多项式: 系统码结构的卷积码: 卷积码的监督矩阵: 卷积…

Pipenv使用指南:轻量级虚拟环境管理工具详解

前言 终于能够挤出一点时间来总结最近学到的一些技术知识点了,博主这两周被居家隔离-集中隔离-居家隔离来回折腾,现在终于是得到解放能够空出的时间来写写博客了,但是项目又催的紧,写博文的时间还是有限,这周我会尽量…

正则语言的性质

正则语言的性质 一、正则语言的性质 1.正则语言的泵引理 设LLL是正则语言,则存在与LLL相关的常数nnn满足:对于任何LLL中的串www,如果∣w∣≥n|w|\geq n∣w∣≥n,则我们就能把www打断为三个串wxyzwxyzwxyz使得: y̸ϵ…

2011年专业408

文章目录0 结果1 题目2 思路2.1 思路1(暴力解:排序)2.2 思路2(较优解:归并合并数组)2.3 思路3(较优解:数组指针后移)2.4 思路4(最优解:两个数组的…

ARM BTI指令介绍

目录 一、JOP 二、BTI 三、启用BTI 四、BTI是怎么实现的 一、JOP JOP(Jump-oriented programming)类似于ROP(Return-Oriented Programming)。在 ROP 攻击中,会扫描出useful gadgets(易被攻击的一段代码…

【数据结构】顺序队列的原理及实现

1.什么是队列 队列是一种比较特殊的线性表,特殊就在于它只允许在表的前端来进行删除,在表的后端来进行插入,队列它是一种操作受限制的线性表。插入的一端称为队尾,删除的一端称为队头,队列里没有元素就称它为空队列。…

快速使用代码编辑工具vim+ctags+cscope快捷使用itop3568开发板

当以上配置全部完成后,每当拿到新的工程代码,进入相关代码目录,利用 vim ./命令打 开当前目录, 然后 crtl 生成插件所需文件,最后使用命令:qa!退出 vim。此步只需进行一 次。 在此目录中打开任意代码文件或任意子目录…

jdk8新特性-日期时间

1、介绍 日期时间类在Java开发中是必不可少的,前后端如何传递时间参数、数据库的时间在Java中对应什么类型、Java中时间转换的各种方式有哪些? 2、Date类 Date类是JDK1.0时期推出来的第一代时间类,位于java.util包下,是最常用的…

unctf easy_serialize反序列化字符逃逸

&#xfeff;ctf题目平台&#xff1a;UNCTF - HACKING 4 FUN。web题难度适中 easy_serialize 题目源码&#xff1a; <?php include "function.php"; $action $_POST[action]; $name $_POST[name]; $pass $_POST[pass]; $email $_POST[email]; ​ function …