可以使用 EXPLAIN 伪指令来显示优化器选择的查询计划,且可以指定不运行查询而显示查询计划。
显示优化器所选择的查询计划。
显示优化器所选择的查询计划,但是不运行查询。
希望仅显示一个 SQL 语句的查询计划时,请使用这些 EXPLAIN 伪指令代替 SET EXPLAIN ON 或 SET EXPLAIN ON 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 中的输出行 | 所选的查询计划描述 |
---|---|
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 值开始进行索引扫描。 |