Informix 11.5 SQL 语句性能监控方法及实现(set explain on) zz
输出行所选的查询计划描述DIRECTIVES FOLLOWED: EXPLAIN AVOID_EXECUTE使用伪指令 EXPLAIN 和 AVOID_EXECUTE 来显示查询计划,而不执行查询。Estimated # of Rows Returned: 7估计该查询返回 7 行。Estimated Cost: 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采用嵌套循环连接方式
?
?
如果用户没有访问 SQL
onmode -Y 命令基本语法:
调用解释onmode -Y sessionid 2打开对 sessionid 的 SET EXPLAIN,并且仅显示查询计划onmode -Y sessionid 1打开对 sessionid 的 SET EXPLAINonmode -Y sessionid 0关闭对 sessionid 的 SET EXPLAIN?
当使用 onmode -Y 命令打开 SET EXPLAIN 时,输出显示在sqexplain.out.sessionid 文件中。
如果希望动态对 session 30 打开 SET EXPLAIN ON AVOID_Execute 特性,我们可以运行:
值描述0禁用查询统计信息的显示1启用查询统计信息的显示?
我们也可以通过修改 onconfig 文件来修改此值,也可以通过 onmode – wf 及 onmode – wm 命令动态设置该值。
QUERY: ------ SELECT company, fname, lname, phone FROM customer c WHERE EXISTS( SELECT customer_num FROM cust_calls u WHERE c.customer_num = u.customer_num) Estimated Cost: 6 Estimated # of Rows Returned: 7 1) virginia.c: SEQUENTIAL SCAN 2) virginia.u: INDEX PATH (First Row) (1) Index Keys: customer_num call_dtime (Key-Only) (Serial, fragments: ALL) Lower Index Filter: virginia.c.customer_num = virginia.u.customer_num NESTED LOOP JOIN (Semi Join)
?
当优化程序将子查询更改成连接时,它可以使用存取计划和连接计划的几种变形形式:
首行扫描是表扫描的一种变形形式。当数据库服务器找到一个匹配时,表扫描将停止。
忽略副本索引扫描是索引扫描的一种变形形式。数据库服务器不扫描副本。
半连接是嵌套循环连接的一种变形形式。当第一个匹配找到时,数据库服务器将停止内表扫描。
?
通过对 SQL 语句查询计划的分析,我们可以知道 SQL 语句在执行过程中是采用什么样的访问方法,是顺序扫描还是索引扫描;表之间连接采用什么样的方法,是嵌套循环连接还是哈希连接;表之间访问的顺序是什么;是否产生了临时表;该查询的成本是多少。依此,我们就可以考虑,为了提高 SQL 语句性能,我们是不是要创建合适的索引, 是不是要调整一下表之间连接的顺序,是不是要修改一下 SQL 语句的写法等。通常,我们在调整时,可以比较一下改变之前及改变之后的查询成本,保证查询成本有一个明显的减少。另外,我们还可以通过设置 OPTCOMPIND 参数来指定数据访问方法 ;通过访问计划指示、连接次序指示、连接计划指示、目标指示来指定数据访问方法、表连接顺序、表连接方法及数据返回结果集;通过执行 update statistics 语句提高 SQL 语句性能。关于 OPTCOMPIND 参数及查询指示的具体使用方法,请参考 Informix 信息中心相关内容。