首页 > 数据库 >达梦SQL优化

达梦SQL优化

时间:2022-09-21 14:24:42浏览次数:58  
标签:t1 索引 操作符 select SQL c1 优化 达梦

1.基本概念

执行计划:
执行计划是SQL语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。在SQL命令行使用EXPLAIN可以打印出语句的执行计划。
操作符:
操作符是SQL执行的基本单元,所有的SQL语句最终都是转换成一连串的操作符最后在服务器上执行,得到需要的结果,
操作符也是读懂执行计划的基础,这里列举一下经常出现的操作符
CSCN SSCN SSEK CSEK BLKUP
这些操作符是SQL查询数据的原始来源,SQL里面出现的基表,都会出现在这些操作符的描述中,通过这些操作符来确定对应的表在执行计划中在何时以什么样的方式进入。
CSCN :基础全表扫描,从头到尾,全部扫描
SSCN :二级索引扫描, 从头到尾,全部扫描
SSEK :二级索引范围扫描,通过键值精准定位到范围或者单值
CSEK :聚簇索引范围扫描,通过键值精准定位到范围或者单值
BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)
更多的操作符解释,可以参见DM7系统管理员手册附录4《执行计划操作符》

2.搭建实验环境

创建表T1并录入数据,相关SQL语句如下:
SQL> CREATE TABLE T1(C1 INT,C2 INT);
SQL> insert into t1 select level,level from dual connect by level < 10000;

3.检验执行计划

--SEL1
SQL> explain select * from t1 where c1 = 5;

有上图结果可知:创建了一个普通表,没有任何索引,过滤,从T1中取出数据只能走全表扫描CSCN。
在此基础上创建一条索引:
SQL> create index i_test1 on t1(c1);
再看下面这个语句的计划
--SEL2
SQL> explain select c1 from t1;

--SEL3
SQL> explain select c2 from t1;

由以上结果可知:这个时候T1存在两个入口,CSCN T1基表,或者SSCN 二级索引I_TEST1,SEL2中,只要求获取C1,二级索引上存在C1,且数据长度比基础表要少(多出一个C2),索引选择SSCN。
对于SEL3,依然没有更好的入口,还是选择CSCN全表。
一般来说,我们认为CSCN和SSCN的耗时是差不多的,SSCN和CSCN的区别在于,SSCN 扫描出来的数据是按索引列排序的,这一点在一些情况下可以利用。
看SSEK的情况:
--SEL4
SQL> explain select * from t1 where c1 = 5;

  查询条件C1 = 多少,存在C1索引,需要注意的是操作符后面的描述scan_range[5,5],表示精准定位到5,多数情况下这样是比较有效率的。
  另外一点,SSEK 上面出现了BLKUP操作符,由于I_TEST1上没有C2的数据,而查询需要SELECT *,索引需要BLKUP回原表查找整行数据。
  所以我们可以想到如果只查询C1,那么BLKUP操作符应该不存在,验证一下:
--SEL5
SQL> explain select c1 from t1 where c1 = 5;

聚簇索引是比较特殊的索引(对应操作符CSEK),在DM7上,同一张表的聚簇索引只允许存在一个,默认建表时(不建堆表的情况下),基表就是一个ROWID聚簇索引,可以预见到对ROWID的精准定位应该会走CSEK。
–SEL6
SQL> explain select c1 from t1 where rowid = 6;

如果我们创建了一个自定义聚簇索引:
SQL> create cluster index i_index2 on t1(c2);
那么ROWID这个聚簇索引就不存在了,取而代指的是按C2为顺序的聚簇索引
--SEL7
SQL> explain select c1 from t1 where rowid = 6;

这里查询中需要C1以及ROWID,而普通二级索引I_TEST1上正好都有,且比聚簇索引的长度要短,所以选择SSCN I_TEST1。
--SEL8
SQL> explain select c1 from t1 where c2 = 6;

可以看到,对ROWID的精准定位不再走精准定位的CSEK,而是全索引扫描I_TEST1,对C2的精准过滤走的CSEK,且不存在BLKUP。

标签:t1,索引,操作符,select,SQL,c1,优化,达梦
From: https://www.cnblogs.com/tazimi/p/16715441.html

相关文章

  • C# Sql多字段插入(反射!)
    publicboolInsert(objectobj){Typetype=obj.GetType();PropertyInfo[]properties=type.GetProperties();st......
  • MySQL查看数据库表容量大小
    1.查看所有数据库容量大小selecttable_schemaas'数据库',sum(table_rows)as'记录数',sum(truncate(data_length/1024/1024,2))as'数据容量(MB)',sum(truncate......
  • 达梦CASE_SENSITIVE参数的作用
    简介:  case_sensitive参数用来设置字符串比较是否大小写敏感,用于确定数据库对象及数据是否区分大小写,默认为区分,不可更改。根本目的是为了兼容不同的数据库,从MYSQL和SQL......
  • 达梦数据迁移
    1、迁移准备停止应用确认要迁移的用户(模式、数据库)记录原数据库中要迁移的对象的数量记录原数据库中要迁移的所有对象名称记录原数据库中要迁移的表的数据量(行数)创建......
  • MySQL主从同步详解与配置
    MySQL主从同步详解与配置走鹿带凨爱生活,有理想,善思考,能沟通 21人赞同了该文章 https://zhuanlan.zhihu.com/p/335142300MySQL主从同......
  • MySQL指令
    目录SQL语言的分类DQL(数据查询语言)select关键字组合顺序select简单查询用法select条件查询select函数使用select多表连接查询select子查询Union结果集合并Limit分页显示DDL......
  • Mysql SQL查询今天、昨天、n天内、第n天的数据
    查询5分钟前的数据select*fromtablewhereend_datebetweendate_add(now(),interval-300SECOND)andNOW()  查询当天的所有数据SELECT*FROM表名WHEREDAT......
  • centos8系统初始化一键优化脚本
    centos8系统初始化一键优化脚本color(){RES_COL=60MOVE_TO_COL="echo-en\\033[${RES_COL}G"SETCOLOR_SUCCESS="echo-en\\033[1;32m"......
  • mysql8.0绿色版安装
    下载软件直达官网下载Community版:https://dev.mysql.com/downloads/mysql/然后拉倒下方点击对应版本位数下载2.安装下载完压缩包之后就解压,2.1在程序安装目录创建my.......
  • 关于sparksql调优的一些操作
    1、查看执行计划 1、直接sql查看:explainselect...from... 2、ds.explain()2、执行计划的处理流程 sql代码->未决断的逻辑执行计划->根据元数据生成已决断的逻辑......