您的位置:首页 > 数据库

如何解读执行计划(上)

2017-04-08 10:13 134 查看
对于top sql分析和定位时候,一般要分析执行计划。在了解执行计划时候,需要知道Oracle数据库在访问我们想要记录的时候过程,叫数据访问路径(DAP:date access process,im:行访问方法)。三种访问路径:table access full、索引、rowid。每一条记录有一个唯一标识,叫rowid。索引作用:映射某一个key,这个key就是一个或者多个列的值,key与rowid之间有maping关系,我们也可以直接通过rowid访问。多表之间连接没有where条件所产生结果不是交集,而是笛卡尔积。执行计划告诉我们Oracle怎么样去执行sql语句访问数据方法以及访问这些对象的顺序,并且会显示在访问过程当使用了哪些对象。

使用explan命令输出我们查询执行计划,理论上来说explan命令可以对任何sql语句(dml、ddl)显示执行计划。如果生成ddl执行计划需要具有访问一系列数据字典权限,如果生成dml执行计划需要具有sql语句中对象权限。explan仅仅是解析执行计划,而不会执行。如果不执行仅仅是解析,有可能执行计划会失真。因为真正使用执行计划时候需要根据统计信息生成执行计划,在绝大多数情况explan命令产生执行计划与真实执行产生执行计划是一样的。

The EXPLAIN command output shows query execution plans.

The statement is only parsed (not executed).

Run utlxplan.sql to create the PLAN_TABLE.

Use vsqlplantoseeexecutionplansinthelibrarycacheUseutlxpls.sqltoformattheplanintheplantableUsetheDBMSXPLANpackageUseSQL∗PlusAUTOTRACEUseSQLTraceandTKPROF(tkprof只对10046事件生成trace文件有效)注意:在生产库中这个操作最好不要做,因为所有解析都要先写到磁盘上,速度会很慢,可以在了解时候用一下。Bestapproach:gettheruntimeplaninVSQL_PLAN

9x: Use the script below

10g: Use DBMS_XPLAN.DISPLAY_CURSOR() or EM (but tough to send from Customer to Support)

Get the Runtime plan in 10046

Appears with “STAT #” lines, but cursor must be closed

优化原则:访问方法尽可能直接找到我们想要的数据,并且用尽可能少的系统资源。

执行计划:一般以parent id为0开始执行sql语句,每一个parent都有child,如果有child先执行,如果有多个并行child,child id小的先执行。

Requirements to use AUTOTRACE:

A PLAN_TABLE

The PLUSTRACE role privileges

to retrieve statistics from some v$ views

SET AUTOTRACE {OFF|ON|TRACEONLY}

[EXPLAIN]

[STATISTICS]

TRACEONLY

Runs the query

Does not show query results

Shows statistics and execution plan

TRACEONLY EXPLAIN

Shows the execution plan without statistics

Does not execute the query(这里指select语句)

dml(insert、update、delete) is execute

Viewing Execution Plans Using DBMS_XPLAN.DISPLAY()

What is DBMS_XPLAN?

Formatting utility for execution plans

Sources: PLAN_TABLE, V$SQL_PLAN, AWR

Source: PLAN_TABLE, use DISPLAY()

Populate using EXPLAIN PLAN

Drawbacks with bind peeking as discussed

dbms_xplan.display (table_name varchar2 default ‘PLAN_TABLE’,

statement_id varchar2 default null,

format varchar2 default ‘TYPICAL’)

table_name: name of plan table

statement_id: statement id used in EXPLAIN PLAN cmd

format: BASIC, TYPICAL, ALL, SERIAL

显示已经被解析过sql语句,如果不是Oracle bug,就是真正执行计划。

Viewing Execution Plans Using DBMS_XPLAN.DISPLAY_CURSOR()

Source: VSQLPLAN,useDISPLAYCURSOR()Statementmusthavebeenparsedandinvsql_plan already

Ideally, statement was executed and actual runtime stats there

dbms_xplan.display_cursor (sql_id varchar2 default null,

cursor_child_no integer default 0,

format varchar2 default ‘TYPICAL’)

By default, will display plan for LAST executed statement by the session

Use ALTER SESSION SET STATISTICS_LEVEL = ALL with format “RUNSTATS_LAST”

Must have select privs on VSQLPLANSTATISTICSALL,VSQL, VSQLPLAN,VSESSION

优化方面:存储规化、发现存储规化毛病、坏了几块盘就不能用了、sql等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库