一条SQL语句在达梦数据库中的整个生命周期

        在谈论一条select SQL语句在达梦数据库中的整个生命周期之前我们先了解一写概念和原理,这样便于理解整篇文章。下边分几个方面进行讨论:

1、一条SQL处理的过程包含哪些方面。

一条sql将进行几个步骤的处理过程:

  1、语法检查(syntax check)

  检查此sql的拼写是否合法。主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如何不符合则不再进行,直接返回语法错误。

  2、语义检查(semantic check)

        诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限,达梦也遵循“先解析 sql 语句,把小写的字母转换成大写的再执行”这样一条规则。先是把表名字转换为大写,去对象字典中查询是否存在,如果存在进行下一步对sql语句涉及的表、字段、视图、索引等对象进行解析,如果不存在,则直接报错对象不存在返回客户端。

  3、对sql语句进行解析(prase)

  利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。 其中,软、硬解析就发生在第3个过程里。

  • 软解析:

        首先判断是否在数据缓冲区db_buffer存在,如果存在且可用,则直接获取该数据而不是从数据文件中去查询。

  • 硬解析:

        若数据不在buffer_cache中,查看db_buffer块头是否有事务,(db_buffer块头有事务,称为热点块)
            (1)如果有,则需要从回滚段(undo)中读取数据,(一致性读取,逻辑读)
            (2)如果没有,则比较select的SCN和db buffer块头的scn号码,如果前者小于后者则仍需要从undo回滚段中读取,        
                 如果前者大于后者说明这是一段非脏数据缓存,直接读取就可以。

  4、执行sql,返回结果(execute and return)

2、一条SQL的真正执行顺序。

        SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

图片中的sql查询语句运行顺序:

第1步,先运行蓝框里的内容,第2步,运行select子句得到查询结果,最后一步,运行orderby对查询结果排序,最后,你会发现规律其实很简单,sql查询语句的运行顺序:select子句,orderby分别最后运行,其他子句按书写顺序运行。

即:

1.from   2.on   3.join   4.where   5.group by   6.with   7.having   8.select  9.distinct   10.order by 

3、联表查询有哪几种方式?分别在什么业务场景下使用?

1、嵌套循环连接(nested loop join)   
    (有驱动表) 适用与大表和小表 ,从A表抽一条记录,遍历B表查找到匹配肌瘤,然后从A表抽下一条,遍历B表,就是一个二重循环。 

        一般在连接表有索引,并且索引选择性较好(也就是selectivity接近1)的时候,也就是驱动表的记录比较小(<10000),而且inner表需要有效地访问方法(index),需要注意的是:join的顺序一定要小,返回结果及的响应时间是最快的。

2、群级联接(couster join)                 

3、排序合并连接(sort-merge-join)

        有参数,一般被禁用,消耗cpu资源大,将AB表都排好序,然后merge,符合条件的选出,hash join就是用来提到sj的,但如果你的服务器的CPU资源和MEM资源都紧张的时候,建议用sort-merge-join,因为hash join比sort-merge-join需要的资源更多,特别是cpu,所以sj大概就用在没有索引,并且数据已经排序的情况下。主要消耗在磁盘IO。

4、笛卡尔集连接(cartesian join)

5、哈希连接(hash join)

        适用与大表和大表,将A表按连接键计算出一个hash表,然后从B表一条一条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录。绝大多数情况下hash join效率比其他join效率更高,hash join主要消耗在cpu上(在内存 sort_area 创建临时hash表,进行hash计算),hash join一般用于一张小表和一张大表进行join时。

4、常见的索引扫描方式有哪些。

第一种:index unique  scan

        索引唯一扫描,当可以优化器发现某个查询条件可以利用到主键、唯一键、具有外键约束的列,或者只是访问其中某行索引所在的数据的时候,优化器会选择这种扫描类型。

第二种:index range scan

        索引范围扫描,当优化器发现在UNIQUE列上使用了大于、小于、大于等于、小于等于以及BETWEEN等就会使用范围扫描,在组合列上只使用部分进行查询,导致查询出多行数据。对非唯一的索引列上进行任何活动都会使用index range scan

第三种:index full scan

        全索引扫描,如果要查询的数据可以全部从索引中获取,则使用全索引扫描。

第四种:index fast full scan

        索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。“在这种存取方法中,可以使用多块读功能,也可以使用并行读入,从而得到最大的吞吐量和缩短执行时间”。

第五种:index skip scan 

        复合索引上,如果 SQL 中谓词条件只包含索引中的部分列,并且这些列不是建立索引时的第一列时,并且返回条数很少,就可能发生INDEX SKIP SCAN。这里 SKIP 的意思是因为查询条件没 有第一列或前面几列,被忽略了。

5、什么是优化器CBO?

优化器有两种:

RBO(Rule-Based Optimization) 基于规则的优化器

CBO(Cost-Based Optimization) 基于代价的优化器

RBO有严格的使用规则,只要按照这套规则去写SQL语句,无论数据表中的内容怎样,也不会影响到你的执行计划,换句话说,RBO对数据“不敏感”,它要求SQL编写人员必须要了解各项细则,因此,CBO是一种比RBO更加合理、可靠的优化器。以后我们说的优化器即CBO。

   CBO: Cost-Based Optimization即“基于代价的优化器”,该优化器通过根据优化规则对关系表达式进行转换,生成多个执行计划,然后CBO会通过根据统计信息(Statistics)和代价模型(Cost Model)计算各种可能“执行计划”的“代价”,即COST,从中选用COST最低的执行方案,作为实际运行方案。

        CBO依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择。统计信息包括SQL执行路径的I/O、网络资源、CPU的使用情况。

6、SQL语句执行的详细过程。

第一步:连接数据库,由连接器负责跟客户端建立连接、获取权限、维持和管理连接。

        首先,客户端通过TCP协议与数据库端口建立连接,此时监听线程dm_lsnr_thd在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程dm_wrkgrp_thd的任务队列,等待工作线程进行处理。

第二步:语句解析。

        客户端的链接缓存在达梦数据库内存session缓冲区,即会话内存池(SESS_POOL),相当Oracle的PGA中的UGA,改用户线程的信息存储到SESS_POOL,完成三次握手。会话建立完成以后,该语句就会通过服务器进程传递给实例(Instance),然后在共享池进行判断,若该语句以前被执行过,那就走软分析,如果以前没有被执行过,就走硬分析。该语句的操作对象是一个表,然后需要数据字典的参与,数据字典会将该表属于哪一个表空间,行属于表空间的哪一个数据文件中,(数据字典也是属于共享池的一个数据缓冲区),然后要进行一个取行的工作,然后就在DM共享池NORMAL中判断要取的数据是否缓存。

附:

数据缓冲区的类别:NORMAL、KEEP、FAST、RECYCLE。

  • NORMAL:normal类数据缓冲区主要提供给系统使用,系统使用可以理解为,以上的操作都是系统操作,就是缓冲区正常的操作。
  • KEEP:       keep类数据缓冲区主要是存放热页的,经常使用的。
  • RECYCLE: recycle类数据缓冲区提供给临时表使用
  • FAST:       fast类数据缓冲区根据用户指定的FAST_POOL_PAGES大小由系统自动管理。

语句解析即分析器分析可以分为很多小动作,主要包含以下几个方面:

  1. 查询高速缓存。
  2. 语句合法性检查。
  3. 语言含义检查。
  4. 获得对象解析锁。
  5. 数据访问权限的核对。
  6. 确定最佳执行计划。

第四步:优化器

        CBO通过计算各种可能的执行计划的“代价”,即COST,从中选用COST最低的执行方案作为实际运行方案,这里影响CBO的因素有很多,除了统计信息之外还有索引、数据分布、高水位线、聚簇因子、系统资源竞争等。CBO根据各方面因素寻找最低代价的执行计划生成最终的执行计划。

第五步:执行器

        接受CBO的执行计划树,执行。

第六步:封装结果集

        将执行的结果集封装后通过I/O线程缓存后返回客户端。

第八步:断开连接、释放资源。

        执行完毕根据相关参数设置对线程资源进行释放。

过程图如下图:这里借用MySQL的图作为参考,原理大同小异。

武汉达梦数据库股份有限公司 24小时免费服务热线:400 991 6599

达梦技术社区:eco.dameng.com

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值