SQL优化-2 查看执行计划
2010-03-23 20:40
417 查看
一、得到执行计划 ,方法很多,我常用的有两种:
1.explain plan for + 要执行的SQL语句。执行完后,可以通过这种方式来得到:select * from table(dbms_xplan.display).虽然这样的version比较老点,但是查看还是很方便的,省了很多设置。
2.建立plan_table表,安装oracle时已经提供了建表语句:这里给出建表语句:
在我电脑中路径是这样的:E:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/utlxplan.sql,具体到实际的机器上由安装路径和操作系统而定。还是通过执行explain plan for 'sql语句',然后select 上表即可。
3.利用第三方工具:PL/SQL developer ,TOAD for oracle 等。
二 、执行计划的阅读规则:最右最上原则。
给出一个例子:
1.explain plan for + 要执行的SQL语句。执行完后,可以通过这种方式来得到:select * from table(dbms_xplan.display).虽然这样的version比较老点,但是查看还是很方便的,省了很多设置。
2.建立plan_table表,安装oracle时已经提供了建表语句:这里给出建表语句:
create table PLAN_TABLE ( statement_id varchar2(30), plan_id number, timestamp date, remarks varchar2(4000), operation varchar2(30), options varchar2(255), object_node varchar2(128), object_owner varchar2(30), object_name varchar2(30), object_alias varchar2(65), object_instance numeric, object_type varchar2(30), optimizer varchar2(255), search_columns number, id numeric, parent_id numeric, depth numeric, position numeric, cost numeric, cardinality numeric, bytes numeric, other_tag varchar2(255), partition_start varchar2(255), partition_stop varchar2(255), partition_id numeric, other long, distribution varchar2(30), cpu_cost numeric, io_cost numeric, temp_space numeric, access_predicates varchar2(4000), filter_predicates varchar2(4000), projection varchar2(4000), time numeric, qblock_name varchar2(30), other_xml clob );
在我电脑中路径是这样的:E:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/utlxplan.sql,具体到实际的机器上由安装路径和操作系统而定。还是通过执行explain plan for 'sql语句',然后select 上表即可。
3.利用第三方工具:PL/SQL developer ,TOAD for oracle 等。
二 、执行计划的阅读规则:最右最上原则。
给出一个例子:
explain plan for SELECT 0, --ID A.aab001, --单位编号 E.aab004, --单位名称 A.aac001, --个人编号 B.aac003, --个人姓名 B.aac002, --***号 A.aka130, --医疗类别 C.akb021, --定点机构名称 D.akc192, --入院日期 D.akc194, --出院日期 A.akc261, --个人账户支付 A.aae040, --消费日期 A.akc190 FROM kc24 A,KC21 D ,ac01 B,ab01 E,t_kb01 C --个人消费明细信息 WHERE A.akb020=D.akb020 AND A.akc190=D.akc190 AND A.aac001=D.aac001 AND A.aac001=B.aac001 AND A.aab001=E.aab001 AND A.akb020=C.akb020; SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (% -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 281 | 47770 | 840 |* 1 | HASH JOIN | | 281 | 47770 | 840 |* 2 | HASH JOIN | | 281 | 40464 | 819 | 3 | TABLE ACCESS FULL | T_KB01 | 721 | 19467 | 5 |* 4 | HASH JOIN | | 282 | 32994 | 813 |* 5 | HASH JOIN | | 677 | 57545 | 762 | 6 | INDEX FAST FULL SCAN| INDEX_KC21_SUN | 677 | 27080 | 4 | 7 | TABLE ACCESS FULL | KC24 | 144K| 6358K| 756 | 8 | INDEX FAST FULL SCAN | IND_AC01_FAST_QUERY | 13364 | 417K| 50 | 9 | INDEX FAST FULL SCAN | IND_AB01_FAST_QUERY | 5536 | 140K| 20 -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("E"."AAB001"=TO_NUMBER("A"."AAB001")) PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- 2 - access("A"."AKB020"="C"."AKB020") 4 - access("B"."AAC001"=TO_NUMBER("A"."AAC001")) 5 - access("A"."AKB020"="D"."AKB020" AND "A"."AKC190"="D"."AKC190" AND "A"."AAC001"="D"."AAC001") Note ----- - 'PLAN_TABLE' is old version 28 rows selected 我还是比较钟情于这样的方式,因为从plan_table查出的没有这样来的直接。
相关文章推荐
- Oracle之SQL优化专题01-查看SQL执行计划的方法
- [Oracle] Sql 优化系列--查看Oracle执行计划的方法
- MySQL数据库性能优化-利用sql执行计划预先查看执行性能(五)
- SQL查询执行计划优化
- Oracle查看SQL语句的执行计划
- 如何查看曾经执行的SQL的执行计划
- 查看sql语句的执行计划
- oracle数据库执行计划统计分析,优化表数据字典,提高sql查询效率
- 引用:初探Sql Server 执行计划及Sql查询优化
- 查看SQL执行计划
- 引用:初探Sql Server 执行计划及Sql查询优化
- Oracle优化——如何查看语句的准确的执行计划(explain plan可能不是真实的)
- 初探Sql Server 执行计划及Sql查询优化
- Oracle查看SQL执行计划的方式
- PL/SQL DEVELOPER执行计划的查看
- 【Oracle】三种方式查看SQL语句的执行计划
- 通过分析SQL语句的执行计划优化SQL(七)(1)
- 如何通过10053查看SQL语句执行计划
- 通过分析SQL语句的执行计划优化SQL(三)
- 通过分析SQL语句的执行计划优化SQL (八)