EXPLAIN 伪指令

可以使用 EXPLAIN 伪指令来显示优化器选择的查询计划,且可以指定不运行查询而显示查询计划。

可以使用这些伪指令:

希望仅显示一个 SQL 语句的查询计划时,请使用这些 EXPLAIN 伪指令代替 SET EXPLAIN ON 或 SET EXPLAIN ON AVOID_Execute 语句。

使用 AVOID_EXECUTE(伪指令或在 SET EXPLAIN 语句中)时,查询不执行但是显示以下消息:
无行返回。
图 1 显示了使用 EXPLAIN AVOID_EXECUTE 伪指令的查询的样本输出。

图: EXPLAIN AVOID_EXECUTE 伪指令的结果

QUERY:
------
select --+ explain avoid_execute
  l.customer_num, l.lname, l.company,
  l.phone, r.call_dtime, r.call_descr
from customer l, cust_calls r
where l.customer_num = r.customer_num

DIRECTIVES FOLLOWED:
EXPLAIN
AVOID_EXECUTE
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 7
Estimated # of Rows Returned: 7

  1) gbasedbt.r: SEQUENTIAL SCAN

  2) gbasedbt.l: INDEX PATH

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