MySQL,Oracle,DB2,PostgreSQL上explain的⽤法转载请注明原地址,谢谢
(⼀)MySQL explain⽤法
explain table_name 或 explain [extended] select select_options
前者可以得出⼀个表的字段结构等,后者提供MySQL如何执⾏SQL语句的⼀些信息。
Explain可以⽤在select,delete,insert,replace和update之前。
Explain输出的列信息
id Select查询的id
select_type select查询的类型,主要是区别普通查询和联合查询、⼦查询之类的复杂查询。
sscanf shellcodetable输出的⾏所引⽤的表
type Join的类型
possible_key MySQL能使⽤哪个索引在该表中到⾏
key显⽰MySQL实际决定使⽤的索引。如果没有索引被选择,键是NULL。mysql语句转oracle
key_len所选键的长度
ref显⽰哪个字段与索引⼀起被使⽤
rows估计要遍历多少条数据
extra额外的信息
这是在MySQL中实测的结果,在将近两千万的数据量上执⾏explain语句,耗时低于10毫秒。
(⼆)Oracle explain plan⽤法
EXPLAIN PLAN
[ SET STATEMENT_ID = string ]
[ INTO [schema.] table_name [@dblink] ]
FOR SQL_STATEMENT ;
EXPLAIN PLAN的相关选项如下:
l STATEMENT_ID
SQL语句的唯⼀标识符。通过使⽤SQL语句的标识符,可以向⼀个计划表中存⼊多条SQL语句。
l TABLE_NAME
存储执⾏计划的计划表的名称。此表必须已经存在并且与标准表结构⼀致。如果没有指定计划表名称,EXPLAIN PLAN会尝试使⽤表名PLAN_TABLE.
l SQL_STATEMENT
javaswing登录你想要知道其执⾏计划的那条SQL语句。这条SQL语句必须是有效的。并且你也必须有⾜够的权限来执⾏它。这条SQL语句可以含有绑定变量。
默认情况下,Oracle会将执⾏计划插⼊如到⼀张名为PLAN_TABLE的表中。可以使⽤脚本utlexplain.sql来创建⾃⼰的计划表。这个脚本位于Oracle软件安装⽬录的⼦⽬录$ORACLE_HMOE/rmdbs/admin/中。从Oracle 10g开始,Oracle会创建⼀个全局临时表PLAN_TABLE供所有⽤户使⽤,所以通常情况下不需要创建⾃⼰的计划表。由于此默认的计划表是⼀个全局临时表,所以你⽆法看到其他会话插⼊的执⾏计划,你的执⾏计划也会随着⾃⼰会话的结束⽽⾃动消失。
PLAN_TABLE表信息
列名类型描述
STATEMENT_ID VARCHAR2(30)在EXPLAIN PLAN的SET STATEMENT_ID⼦句提供的SQL语句的唯⼀标志符。PLAN_ID NUMBER执⾏计划的在全局表plan_table中的唯⼀标识符
TIMESTAMP DATE EXPLAN PLAN语句执⾏的⽇期和时间
REMARKS VARCHAR2(80)注释
php的运行方式OPERATION VARCHAR2(30)执⾏的操作类型。如TABLE ACCESS,SORT或HASH JOIN
OPTIONS VARCHAR2(225)操作的附加信息,例如,以TABLE SCAN为例,选项可能是FULL或BY ROWID
OBJECT_NODE VARCHAR2(128)如果是分布式查询,这⼀列表⽰⽤于引⽤对象的数据库链接名称。如果并⾏查询,它的值可能对应⼀个临时的结果集。
OBJECT_NAME VARCHAR2(30)对象名称
OBJECT_ALIAS VARCHAR2(65)对象的别名
OBJECT_INSTANCE NUMERIC对象在SQL语句中的位置OBJECT_TYPE VARCHAR2(30)对象的类型(表,索引等)
OPTIMIZER VARCHAR2(255)解释SQL语句时⽣效的优化器
ID NUMERIC执⾏计划的ID号
PARENT_ID NUMERIC上⼀个步骤的ID号
DEPTH NUMERIC操作的深度
POSITION NUMERIC如果两个步骤有相同的⽗步骤,有更低POSITION值的步骤将被先执⾏COST NUMERIC优化器估算出来的此操作的相对成本
CARDINALITY NUMERIC优化器预期这⼀步将返回的记录数
BYTES NUMERIC预计这⼀步将返回的字节数
OTHER_TAG VARCHAR2(255)标识OTHER列中的值的类型。
PARTITION_START VARCHAR2(255)访问的分区范围的起始分区
PARTITION_STOP VARCHAR2(255)访问的分区范围的结束分区
PARTITION_ID NUMERIC计算PARTITION_START和PARTITION_STOP列的值对的ID
OTHER LONG 对于分布式查询,这列可能是包含发往远程数据库的SQL语句的⽂本。对于并⾏查询,它⽐啊是并⾏从属进程执⾏的SQL语句。
DISTRIBUTION VARCHAR2(30)描述记录是如何从⼀组并⾏查询从属进程分配到后续的“消费者”从属进程的。CPU_COST NUMERIC估算出来的操作的CPU成本
IO_COST NUMERIC估算出来的的操作的IO成本
TEMP_SPACE NUMERIC估算出来的这⼀步操作所使⽤的临时存储的空间⼤⼩
java8新特性streamACCESS_PREDICATES VARCHAR2(4000)SQL语句中,确定如何在当前步骤中提取记录的⼦句。
FILTER_PREDICATES VARCHAR2(4000)SQL语句中确定对见记录进⾏过滤的⼦句路,如WHERE⼦句在⾮索引列上的条件。PROJECTION VARCHAR2(4000)决定将返回的记录的⼦句,通常是SELECT后⾯的字段列表
TIME NUMBER(20,2)优化器为这⼀步执⾏估算的时间消耗
QBLOCK_NAME VARCHAR2(30)查询块的唯⼀标识符。
查看执⾏计划
有两种⽅法可以查看执⾏计划:直接查看计划表(SQL语句)和DBMS_XPLAN.DISPALY表函数。
第⼆种例⼦
SQL> select * from table(dbms_xplan.display());
(三)PostgreSQL explain⽤法
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statementopengl教程pdf
option有以下⼏种
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
各参数含义
ANALYZE:执⾏语句并显⽰真正的运⾏时间和其它统计信息,默认值False。注意:ANALYZE会真正执⾏SQL语句。
VERBOSE:显⽰额外的信息,尤其是计划树中每个节点的字段列表,schema识别表和函数名称。总是打印统计数据中显⽰的每个触发器的名字。这个参数缺省为FALSE。
COSTS:包括每个计划节点的启动成本预估和总成本的消耗,也包括⾏数和⾏宽度的预估。这个参数缺省为TRUE。
BUFFERS:包含Buffer使⽤信息。特别包括共享块命中、读、脏和写的次数,本地块命中、读、脏和写,临时块读和写的次数。命中意味着避免了物理读,因为块在需要时已经在缓存中发现了。共享块包含普通表和索引的数据;本地块包含临时表和索引的数据;⽽临时块包含⽤于排序、哈希、物化计划节点和类似情况的短期⼯作数据。脏块的数量表⽰该查询之前改变且未提交的块的数量;写块的数量表⽰在查询时被后台进程从缓存释放的脏块数量。上层节点显⽰的块的数量是所有它的⼦节点使⽤块的数量合计。在⽂本格式中只打印⾮零值。该参数可能只在ANALYZE也启⽤的时候使⽤。它的缺省为FALSE。
TIMING:在输出中包含实际启动时间和每个节点花费的时间。重复读系统块在某些系统上会显著的减缓查询的速度,所以当需要只统计实际⾏数且没有准确时间时,该参数设置为FALSE会很有⽤。即使
节点级别时间统计被关闭,整个语句的运⾏时间也是要被计量的。
这个参数可能只在ANALYZE也启⽤的时候使⽤。缺省为TRUE。
FORMAT:声明输出格式,可以为TEXT, XML, JSON或YAML。⾮⽂本的输出包含⽂本输出格式相同的信息,但是更容易被程序解析。这个参数缺省为TEXT。
例⼦:
(四)DB2 explain⽤法
在DB2中查看执⾏计划⽐较⿇烦,以下是查看步骤:
1. 在DB2中,我们必须⾸先创建⼀组特殊的表(解释表)之后才能捕获解释信息。
db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL
2. 设置成解释模式,并不真正执⾏下⾯将发出的sql命令
db2 set current explain mode explain
3. 执⾏sql语句
例⼦:db2 “select * from user”
4.取消解释模式
db2 set current explain mode no
5.执⾏计划输出到⽂件db2exmt.out
db2exfmt -d sample -g TIC -w -l -s % -n % -o db2exmt.out
db2exmt.out⽂件中包含cost信息。
db2还有⼀种⽅法可以查看执⾏计划相关信息。⾸先创建explain表:
$ db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL
然后在你想查看的SQL语句前⾯加上explain plan for
例如:explain plan for select * for test
此时并不会想MySQL⼀样直接显⽰相关信息。执⾏计划相关信息在EXPLAIN_STATEMENT中
执⾏SQL语句 select * for EXPLAIN_STATEMENT 就可以查看执⾏计划相关信息
总结:MySQL直接在语句前使⽤explain,返回结果是同select查询⼀样的结果集。
Oracle是直接在语句前使⽤explain plan for(当然其中还可以设置许多参数),不返回结果,执⾏计划信息存在特定的表中,可通过SQL语句查询。
PostgreSQL同MySQL⼀样也是直接在语句前使⽤explain,返回结果是⽂本。
DB2⽐较⿇烦,需要进⾏⼀些设置,其结果存在特定的⽂件中。
以上四种数据库中,除MySQL外,其他三种数据库的执⾏计划信息中都包含cost信息。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论