SinoDB数据库执行计划

  SinoDB数据库执行计划是指SinoDB数据库根据查询语句以最优的方式执行查询的步骤。我们通常希望数据库服务器能够根据代价估算,选定代价最小的执行计划。

1. 执行计划基础

  执行计划是数据库优化器选择的访问计划和连接计划的组合。

1.1 访问计划

  访问计划是指 SinoDB数据库是通过什么方法来读取磁盘上的数据。有以下几种访问计划:

  • 顺序扫描(Sequential scan):整个表数据被顺序读取。

  • 索引扫描(Index scan):通过索引访问数据。

  • 键值唯一扫描(Key-only index scan):查询列表里的所有字段全部包含在索引中。这种情况下,只须读取索引页即可,不需要读取表的数据页。

  • 键值优先扫描(Key-first index scan):使用其他键值过滤来补充到向上/向下的索引过滤,从而减少SQL读取的总行数。

  • 自动索引扫描(Auto-index scan):在两表关联查询中,在两张表的关联条件字段上都没有索引,优化器在评估后自动建立临时索引。

  • 重复忽略(Skip Duplicate):忽略第二张表上的重复条件。

2.2 连接计划

  连接计划是指表的关联方法。

  • 嵌套循环连接(Nested-loop)
  • 哈希连接(Hash join):两张表通过哈希算法进行关联。

2. 查看执行计划

  • 查看sql语句的执行计划并执行语句:

set explain on;
select * from tab1,tab2 where tab1.id=tab2.id;

执行计划会默认输出到当前目录下的sqexplain.out文件中。

  • 查看sql语句的执行计划但不执行语句:

set explain on avoid_execute;
select * from tab1,tab2 where tab1.id=tab2.id;

  • 查看sql语句的执行计划,并将结果输出到指定文件/tmp/explain.out中:

set explain file to ‘/tmp/explain.out’ ;
select * from tab1,tab2 where tab1.id=tab2.id;

  • 关闭执行计划:

set explain off;

3. 执行计划示例

以下是查询计划输出文件sqexplain.out的示例:

下表是对上述 sqexplain.out 文件输出的查询计划的解释:

输出行 所选查询计划
DIRECTIVES FOLLOWED: EXPLAIN AVOID_EXECUTE 使用伪指令 EXPLAIN 和 AVOID_EXECUTE 来显示查询计划,而不执行查询。
Estimated Cost: 7 该估计成本值为 7,优化程序使用该值来比较不同查询计划并选择成本最低的查询计划。
Estimated # of Rows Returned: 7 估计该查询返回 7 行。
1) Informix.r: SEQUENTIAL SCAN 将 cust_calls r 表用作外表并对它进行顺序扫描以获取每一行。
2) Informix.l: INDEX PATH 对于外表中的每一行,使用索引获取内表 customer l 中的匹配行。
(1) Index Keys: customer_num (Serial, fragments: ALL) 使用 customer_num 列的索引,对其进行连续扫描,并扫描所有的分段(customer l 表只有一个分段组成)。
Lower Index Filter: Informix.l.customer_num = Informix.r.customer_num 从外表的 customer_num 值开始进行索引扫描。
NESTED LOOP JOIN 采用嵌套循环连接方式

关于执行计划的更详细说明请参考以下链接:
基于代价的查询优化器 - 知识库 / 运维管理 - Sinoregal Tech Forum