pl/sql developer这款工具的F5键出来的分析计划窗口怎么用? pl/sql developer这款工具的F5键出来的分析计划窗口怎么用?经理经常叫我用F5键来分析select语句好进行优化。可是不知道怎么用,主要不明白那些数字有什么用,有例子么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 查看sql语句的执行计划,看看oracle是怎么优化你写的sql语句的 /*什么是执行计划 所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究的事情。同样对于查询而言,我们提交的SQL仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的SQL中是没有给出提示信息的,是由数据库来决定的。*/--我们先简单的看一个执行计划的对比: SQL> set autotrace traceonly--执行计划一: SQL> select count(*) from t; COUNT(*) ---------- 24815 Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 TABLE Access (FULL) OF 'T'--执行计划二: SQL> select count(*) from t; COUNT(*) 24815 Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE) (Cost=26 Card=28180)/*这两个执行计划中,第一个表示求和是通过进行全表扫描来做的,把整个表中数据读入内存来逐条累加;第二个表示根据表中索引,把整个索引读进内存来逐条累加,而不用去读表中的数据。但是这两种方式到底哪种快呢?通常来说可能二比一快,但也不是绝对的。这是一个很简单的例子演示执行计划的差异。对于复杂的SQL(表连接、嵌套子查询等),执行计划可能几十种甚至上百种,但是到底那种最好呢?我们事前并不知道,数据库本身也不知道,但是数据库会根据一定的规则或者统计信息(statistics)去选择一个执行计划,通常来说选择的是比较优的,但也有选择失误的时候,这就是这次讨论的价值所在。*/ 通过F5查看到的执行计划,其实是pl/sql developer工具内部执行查询 plan_table表然后格式化的结果。select * from plan_table where statement_id='...'。其中Description列描述当前的数据库操作,Object owner列表示对象所属用户,Object name表示操作的对象,Cost列表示当前操作的代价(消耗),这个列基本上就是评价SQL语句的优劣,Cardinality列表示操作影响的行数,Bytes列表示字节数Description列的操作是按缩进从内往外执行的 表字段的多少会影响查询速度吗 oracle问题 希望大家帮忙啊 oracle新人求教 dblink问题 ORACLE 添加 删除字段怎么弄? 如何查询所有实例? ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询 请大家帮帮忙,实在没有办法了。 pro*c++多线程编程问题?(在线) toad的使用问题,急,在线等,先谢过! oracle在存储过程中,如何删除和创建表? 在pl*plus worksheep中的字号能不能变大? sum函数求和问题 连接符
/*
什么是执行计划
所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究的事情。同样对于查询而言,我们提交的SQL仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的SQL中是没有给出提示信息的,是由数据库来决定的。*/
--我们先简单的看一个执行计划的对比:
SQL> set autotrace traceonly--执行计划一: SQL> select count(*) from t;
COUNT(*)
----------
24815
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE Access (FULL) OF 'T'--执行计划二: SQL> select count(*) from t;
COUNT(*)
24815
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE) (Cost=26 Card=28180)
/*
这两个执行计划中,第一个表示求和是通过进行全表扫描来做的,把整个表中数据读入内存来逐条累加;
第二个表示根据表中索引,把整个索引读进内存来逐条累加,而不用去读表中的数据。
但是这两种方式到底哪种快呢?通常来说可能二比一快,但也不是绝对的。
这是一个很简单的例子演示执行计划的差异。
对于复杂的SQL(表连接、嵌套子查询等),执行计划可能几十种甚至上百种,
但是到底那种最好呢?我们事前并不知道,数据库本身也不知道,
但是数据库会根据一定的规则或者统计信息(statistics)去选择一个执行计划,
通常来说选择的是比较优的,但也有选择失误的时候,这就是这次讨论的价值所在。
*/
select * from plan_table where statement_id='...'。其中
Description列描述当前的数据库操作,
Object owner列表示对象所属用户,
Object name表示操作的对象,
Cost列表示当前操作的代价(消耗),这个列基本上就是评价SQL语句的优劣,
Cardinality列表示操作影响的行数,
Bytes列表示字节数Description列的操作是按缩进从内往外执行的