执行计划是SQL语句的执行方式,达梦数据库查询优化器是基于代价计算的。
在选择使用的执行计划时会受环境,比如统计信息的影响。如果统计信息不正确,可能会导致优化器使用错误的执行计划,从而导致SQL执行异常。如果SQL执行时间异常,就需要查看对应的执行计划是否正确。
在执行计划中需要重点关注两点:数据访问路径和连接方式。这些内容在执行计划中通过操作符来体现。
操作符是SQL执行的基本单元,所有的SQL语句最终都会转换成一连串的操作符,最后在数据库实例上执行。
执行计划是由一系列基本的“操作符”组成的树状结构。解读的关键是理解每个操作符的含义。执行计划的阅读顺序通常是 从右到左,从内到外(最缩进的操作最先执行)。执行计划是由一系列基本的“操作符”组成的树状结构。解读的关键是理解每个操作符的含义。执行计划的阅读顺序通常是 从右到左,从内到外(最缩进的操作最先执行)。
CSCN:基础全表扫描,从头到尾,全部扫描。
SSCN:二级索引扫描,从头到尾,全部扫描。
SSEK:二级索引范围扫描,通过键值精准定位到范围或单值。
CSEK:聚集索引范围扫描,通过键值精准定位到范围或单值。
BLKUP:根据二级索引的ROWID,回原表中取出全部数据。
SLCT:过滤条件,对结果集进行过滤。
SORT:排序操作符。
每种访问操作符,底层对应各种算子,对应各种方式去表内取数据,通过调用不同的算子,不同的顺序,把数据从表取出来,每种算子,在不同的场景,会消耗不同的CPU,和IO,即成本代价,优化器基于CBO,选择“最优”的算子顺序和组合,即执行计划,去表中取数据。
NEST LOOP INNER JOIN(嵌套循环连接):非等值连接时会选择嵌套连接。
HASH JOIN(哈希连接):两张表进行等值连接时会选择哈希连接。
INDEX JOIN(索引连接):将一张表的数据拿出,去另一张表上进行范围扫描,找出需要的数据行,要求扫描表的连接列上存在索引。
MERGE JOIN(归并连接):两张表的连接列均为索引列,可以按照索引顺序进行归并,一个归并就可以找出满足条件的记录。
方法1:SQL语句中使用关键字explain。如:
explain select
SESS_ID, state, thrd_id, dbms_lob.substr(sf_get_session_sql(sess_id)) sql_text, datediff(ss, last_send_time, sysdate) run_time
From v$sessions Where state<>‘IDLE’ and sess_id != sessid order by 5 desc;
EXPLAIN:获得的执行计划是估算的执行计划
优点:无需真正执行,快捷方便
缺点:执行计划是估算的执行计划,有可能与真实执行计划存在差别
使用场景:实用于可以快速返回结果的sql语句
方法2:使用 AUTOTRACE 查看执行计划
SQL> SET AUTOTRACE ON;
SQL> select * from MY_SHOP.MY_SHOP WHERE ID=1;
文章
阅读量
获赞