浏览 4186 次
锁定老帖子 主题:在sqlplus中如何开启并读懂执行计划
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-20
要用sys用户登入并下列步骤: (1)@?\rdbms\admin\utlxplan --建立plan_table表 (2)10G之前plan_table是没有同义词的,所以要加上create public synonym plan_table for plan_table。【此步:option】因为:In 10g, you don't need to create plan_table in your schema to explain plan. It uses the table plan_table$ belonging to SYS through a public synonym. The table is a session duration-based global temporary table. Makes perfect sense! (3)grant all on plan_table to public (4)@?\sqlplus\admin\plustrce 到此为止,DBA用户首先被授予了plustrace角色,然后我们可以把plustrace授予public。如果你需要限制Autotrace权限,可以把对public的授权改为对特定user的授权。例如:grant plustrace to scott。 【倘若根据以上步骤不行,则: 1. 1.)什么用户执行的set autotrace 2.)plan_table和plustrace是否按照要求创建和授权 2. 如果都已经按照要求做过,还报错的话,可以grant select any dictionary to your_user,再验证一下是否可以使用。 3. 再不行drop plan_table重建呢? 】 Notice: (1)Explain 唯一的限制是用户必须是所解释事物的所有者,否则可能报错。 (2)在pl/sql dev中,我们可以使用explain plan for+ select字句,然后再执行select * from table(DBMS_XPLAN.display)。 关于Autotrace几个常用选项的说明: Set autotrace off :缺省值。 Set autotrace on :含查询输出,执行计划,统计信息 On后有两个可选参数: Explain:含查询输出,执行计划 Statistics:含查询输出,统计信息 Set autotrace traceonly:含执行计划,统计信息 2 如何看懂oracle执行计划? (1)什么是执行计划 答:当执行查询操作时对搜索路径(access path)的显示 (2)如何访问数据 答:逻辑上oracle通过以下三种方式获得数据: A 全表扫描(FTS) B 索引扫描(逻辑ROWID) C 物理ROWID Notice: FTS:全表扫描会使表使用上升到HWM。当我们不断插入数据时,HWM会往不断上移,这样,在HWM之下的,就表示使用过的块,HWM之上的就表示已分配但从未使用过的块.原则上HWM只增不减,即使表中数据全删,HWM还是原值。出于这个特点,HWM很像一个水库的最高水位,不能说一个水库没水了,就说该水库的历史最高水位为0.但如果我们使用truncate命令,则该表的HWM会被重新置为0。 (3) 执行计划层次关系 采用最右最上最先执行的原则 例子: 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 MERGE JOIN 2 1 SORT (JOIN) 3 2 NESTED LOOPS 4 3 TABLE ACCESS (FULL) OF 'B' 5 3 TABLE ACCESS (BY INDEX ROWID) OF 'A' 6 5 INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE) 7 1 SORT (JOIN) 8 7 TABLE ACCESS (FULL) OF 'C' 看执行计划的第3列,即字母部分,每列值的左面有空格作为缩进字符。在该列值左边的空格越多,说明该列值的缩进越多,该列值也越靠右。如上面的执行计划所示:第一列值为6的行的缩进最多,即该行最靠右;第一列值为4、5的行的缩进一样,其靠右的程度也一样,但是第一列值为4的行比第一列值为5的行靠上;谈论上下关系时,只对连续的、缩进一致的行有效。 优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采用CBO还是RBO: SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采用CBO SELECT STATEMENT [CHOOSE] --Cost为空,采用RBO(9I是如此显示的) (4) 统计信息 0 recursive calls(循环递归次数。一般原因:dictionary cache未命中;动态存储扩展;PL/SQL语句) 8 db block gets(buffer中读取的block数量,用于insert,update,delete,select for update) 6 consistent gets(回滚段中读的block数量) 0 physical reads(物理读:从磁盘读到buffer cache中的数据块数量) 0 redo size (写到redo logs的数据量) 551 bytes sent via SQL*Net to client 430 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) (在内存中发生的排序) 0 sorts (disk) (在硬盘中发生的排序,与sort_area_size有关) Notice:逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsical reads'。 本人是菜鸟。欢迎大牛吐口水和给建议。 Refer: http://www.eygle.com/faq/AutoTrace.htm http://wenku.it168.com/d_000147651.shtml http://space.itpub.net/35489/viewspace-430027 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |