ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle数据库管理 » 请教如何查看SQL执行计划

标题: [性能调整] 请教如何查看SQL执行计划
离线 mudwzq
幸福在哪里


精华贴数 0
个人空间 0
技术积分 326 (6127)
社区积分 22 (7470)
注册日期 2008-9-14
论坛徽章:2
授权会员2008北京奥运纪念徽章:花样游泳    
      

发表于 2008-10-2 12:36 
请教如何查看SQL执行计划

请教如何查看执行计划

通过sql_trace跟踪得到了该SQL的执行计划,但不会看,请大家教我如何看懂执行计划
下面是一条SQL的执行计划,能详细说说各个信息代表什么意思吗?

这是执行的SQL语句,索引建立的是列ORDDATE + UNIT_PRICE的复合索引
select /*+ index(ord ix_ord_odate_uprice) */  *
from ord
where unit_price in (2000, 3000, 5000)
and orddate like '1997%'

下面的是跟踪得到的执行计划,就是看不懂
Call              Count             CPU Time                 Elapsed Time                Disk              Query            Current               Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse              1                0.000                                  0.000                            0                    0                      0                          0                     
Execute          1                0.000                                  0.000                            0                    0                      0                          0
Fetch            481              0.047                                  0.059                            0                 1424                  0                        4800
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total             483              0.047                                  0.059                            0                  1424                  0                       4800


Elapsed Time for Client(sec.): 0.182
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user: SQLT (ID=68)


Rows Row Source Operation
------- ---------------------------------------------------
       0     STATEMENT
4800     TABLE ACCESS BY INDEX ROWID ORD
4800     INDEX RANGE SCAN IX_ORD_ODATE_UPRICE OF IX_ORD_ODATE_UPRICE (NONUNIQUE)


__________________
只看该作者    顶部
离线 mudwzq
幸福在哪里


精华贴数 0
个人空间 0
技术积分 326 (6127)
社区积分 22 (7470)
注册日期 2008-9-14
论坛徽章:2
授权会员2008北京奥运纪念徽章:花样游泳    
      

发表于 2008-10-2 21:28 
帮忙看看啊,有人研究过执行计划吗?


__________________
只看该作者    顶部
离线 jlttt
请叫我oracler


精华贴数 0
个人空间 0
技术积分 483 (4119)
社区积分 0 (1344385)
注册日期 2007-4-10
论坛徽章:3
授权会员生肖徽章2007版:猴BLOG每日发帖之星   
      

发表于 2008-10-3 09:27 
兄弟,有时候靠人不如靠自己啊。google和baidu会成为你战壕里的兄弟。
现在坛子里的大牛都忙,没空理会咱们这些小啰啰


__________________
oracling~~
只看该作者    顶部
离线 acazhang
猫猫吃竹子


精华贴数 0
个人空间 0
技术积分 1147 (1612)
社区积分 10 (11224)
注册日期 2007-6-12
论坛徽章:4
2008北京奥运纪念徽章:皮划艇静水2008年新春纪念徽章生肖徽章2007版:鼠生肖徽章2007版:牛  
      

发表于 2008-10-3 09:31 
Rows Row Source Operation
------- ---------------------------------------------------
       0     STATEMENT
4800     TABLE ACCESS BY INDEX ROWID ORD
4800     INDEX RANGE SCAN IX_ORD_ODATE_UPRICE OF IX_ORD_ODATE_UPRICE (NONUNIQUE)

就是你找的执行计划。   如何看懂,建议你一边看书,一边练习。

SQL_TRACE可以跟踪某个会话。   
autotrace更好用。  LZ可以查查书。


只看该作者    顶部
离线 mudwzq
幸福在哪里


精华贴数 0
个人空间 0
技术积分 326 (6127)
社区积分 22 (7470)
注册日期 2008-9-14
论坛徽章:2
授权会员2008北京奥运纪念徽章:花样游泳    
      

发表于 2008-10-3 12:52 


QUOTE:
原帖由 jlttt 于 2008-10-3 09:27 发表
兄弟,有时候靠人不如靠自己啊。google和baidu会成为你战壕里的兄弟。
现在坛子里的大牛都忙,没空理会咱们这些小啰啰

哎,网上搜不到具体的信息啊,我想知道执行计划中每一个字段代表什么意思,现在就知道CPUTIME,和读取的DISK块数,其它段看不懂啊
想知道如何通过执行计划分析出不好的SQL语句,来进行调优啊


__________________
只看该作者    顶部
离线 mudwzq
幸福在哪里


精华贴数 0
个人空间 0
技术积分 326 (6127)
社区积分 22 (7470)
注册日期 2008-9-14
论坛徽章:2
授权会员2008北京奥运纪念徽章:花样游泳    
      

发表于 2008-10-3 12:53 


QUOTE:
原帖由 acazhang 于 2008-10-3 09:31 发表
Rows Row Source Operation
------- ---------------------------------------------------
       0     STATEMENT
4800     TABLE ACCESS BY INDEX ROWID ORD
4800     INDEX RANGE SCAN IX_ORD_ODATE_UPRICE OF IX_ORD_ODATE_UPRICE (NONUNIQUE)

就是你找的执行计划。   如何看懂,建议你一边看书,一边练习。

SQL_TRACE可以跟踪某个会话。   
autotrace更好用。  LZ可以查查书。

你有看过这方面的书吗?可否推荐一下,我这个用的就是autotrace,就是不会看,更不会据此来调优


__________________
只看该作者    顶部
离线 cactus0509
www.pagecool.com.cn



精华贴数 0
个人空间 0
技术积分 250 (7872)
社区积分 10 (11178)
注册日期 2006-12-18
论坛徽章:0
      
      

发表于 2008-10-3 13:12 
9i还是10g?
10g 下
SQL> set autotrace on;

SQL> select * from test;

        ID
----------
         2
         1


Execution Plan
----------------------------------------------------------
Plan hash value: 1357081020

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     3 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| TEST |     1 |     3 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
        209  recursive calls
          0  db block gets
         30  consistent gets
          8  physical reads
          0  redo size
        571  bytes sent via SQL*Net to client
        469  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          4  sorts (memory)
          0  sorts (disk)
          2  rows processed


__________________
联系方式:QQ:4039795  msn:flasher@netcaching.com
个人网站:http://www.pagecool.com.cn
   依靠Oracle能创业吗? 假如不能,那么你是技术狂吗?有狂热不动的那天, 想想吧,依靠Oracle 怎么能拿着兴趣去赚钱。
只看该作者    顶部
离线 cactus0509
www.pagecool.com.cn



精华贴数 0
个人空间 0
技术积分 250 (7872)
社区积分 10 (11178)
注册日期 2006-12-18
论坛徽章:0
      
      

发表于 2008-10-3 13:17 


QUOTE:
原帖由 mudwzq 于 2008-10-2 12:36 发表
请教如何查看执行计划

通过sql_trace跟踪得到了该SQL的执行计划,但不会看,请大家教我如何看懂执行计划
下面是一条SQL的执行计划,能详细说说各个信息代表什么意思吗?

这是执行的SQL语句,索引建立的是列ORDDATE + UNIT_PRICE的复合索引
select /*+ index(ord ix_ord_odate_uprice) */  *
from ord
where unit_price in (2000, 3000, 5000)
and orddate like '1997%'

下面的是跟踪得到的执行计划,就是看不懂
Call              Count             CPU Time                 Elapsed Time                Disk              Query            Current               Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse              1                0.000                                  0.000                            0                    0                      0                          0                     
Execute          1                0.000                                  0.000                            0                    0                      0                          0
Fetch            481             0.047                                  0.059                            0                 1424                  0                        4800
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total             483              0.047                                  0.059                            0                  1424                  0                       4800

解释:
Parse: 这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。
Execute: 这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。
Fetch: 返回查询语句中所获得的记录,这步只有select语句会被执行。
COUNT: 这个语句被parse、execute、fetch的次数。

CPU: 这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED: 这个语句所有消耗在parse、execute、fetch的总的时间。
DISK: 从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY: 在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。 一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。
CURRENT: 在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取buffer。在current模式下如果在高速缓存区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。
ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,
对于insert、update、delete操作,返回记录则是在execute这步。





Elapsed Time for Client(sec.): 0.182
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user: SQLT (ID=68)


Rows Row Source Operation
------- ---------------------------------------------------
       0     STATEMENT
4800     TABLE ACCESS BY INDEX ROWID ORD
4800     INDEX RANGE SCAN IX_ORD_ODATE_UPRICE OF IX_ORD_ODATE_UPRICE (NONUNIQUE)




__________________
联系方式:QQ:4039795  msn:flasher@netcaching.com
个人网站:http://www.pagecool.com.cn
   依靠Oracle能创业吗? 假如不能,那么你是技术狂吗?有狂热不动的那天, 想想吧,依靠Oracle 怎么能拿着兴趣去赚钱。
只看该作者    顶部
离线 owlstudio
db.dw.dm@gmail.com
9i OCP


来自 北京
精华贴数 0
个人空间 154
技术积分 2365 (675)
社区积分 67 (4303)
注册日期 2005-3-16
论坛徽章:11
ITPUB元老2008北京奥运纪念徽章:击剑    
      

发表于 2008-10-3 22:37 
看看PUB出的“Oracle数据库性能优化”那本书,记得有几章讲得很详细。
其实网上也有很多文章了,善意批评一下LZ, 有点懒哦!


__________________
纸上来得终觉浅,绝知此事要躬行!

MSN/Email: db.dw.dm@gmail.com   欢迎交流!  
BLOG:         专注 - 思考 - 创新
只看该作者    顶部
离线 owlstudio
db.dw.dm@gmail.com
9i OCP


来自 北京
精华贴数 0
个人空间 154
技术积分 2365 (675)
社区积分 67 (4303)
注册日期 2005-3-16
论坛徽章:11
ITPUB元老2008北京奥运纪念徽章:击剑    
      

发表于 2008-10-3 22:37 
不要等着别人来教你,学习要靠自己!


__________________
纸上来得终觉浅,绝知此事要躬行!

MSN/Email: db.dw.dm@gmail.com   欢迎交流!  
BLOG:         专注 - 思考 - 创新
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问