2007-01-11

精华推荐:Oracle数据库业务优化心得

来源: 本站收集整理 作者:佚名 评论 0 条
 

获取有性能问题的SQL语句,我们主要有两个途径,一个是通过STATSPACK报告。报告中有两节是我们需要重点眼球的:《SQL ordered by Gets for》和《SQL ordered by Reads for DB》,这两节中分别按语句读取内存数据库块和读取的物理数据库块(数据库块是指ORACLE的块大小,一般是操作系统最小块的整数倍)的数量倒序排列,假如其中的语句不全(太长),可通过HASH_VALUE值到ORACLE的动态视图V$SQLTEXT中获取该SQL的全部语句。第二个是通过ORACLE系统的动态视图,V$SQL,该视图记录了每个SQL语句的执行次数,物理读和内存读、执行时间等等很多SQL语句的执行信息,可以通过如下语句选择一下物理读和内存读较高的语句:

SELECT 

t.HASH_VALUE,

t.EXECUTIONS,

t.DISK_READS,

round(t.DISK_READS/t.EXECUTIONS) AS perDiskReads, 

t.BUFFER_GETS,

round(t.BUFFER_GETS/t.EXECUTIONS) AS perBufferReads,

t.ELAPSED_TIME,

round(t.ELAPSED_TIME/t.EXECUTIONS) AS perElayTime,

t.CPU_TIME,

round(t.CPU_TIME/t.EXECUTIONS) AS perCpuTime,

t.FIRST_LOAD_TIME,

t.SQL_TEXT

FROM v$sql t

WHERE (t.DISK_READS/t.EXECUTIONS > 

500 OR t.BUFFER_GETS/t.EXECUTIONS > 20000)

AND t.EXECUTIONS > 0

ORDER BY 6 DESC;

这个语句查询出来的SQL可能也不全,也可以通过HASH_VALUE在V$SQLTEXT中找到其全部的SQL。

对于找到的SQL语句我们可以逐一分析其执行计划,结合涉及到的表的数据量,我们可以估算或者测试该语句的执行效率,分析表WHERE条件中涉及的字段(术语叫做谓词),该字段数据分布如何,选择性是否好,是否有索引。这是一个非常繁杂和琐碎的工作,但从这些琐碎的工作中,我们能发现那些SQL执行时选择的索引不对,哪些表缺少相应的索引导致了全表扫描,哪些语句条件不够导致对分区表进行了全表扫描。总之,对于一个给定的SQL,我们结合其表数据量的大小和分布,SQL中使用的查询条件,能够找到一个性能最优的执行方式,通过调整索引、使用ORACLE提示,使ORACLE系统按照最优的方式来执行SQL。如何去分析和确定ORACLE的执行方式,一个最普遍的原则就是尽量根据其谓词(查询条件),使用选择性最好的索引(当然,对于一些小表,可以考虑使用全表扫描的方式性能会更好)。对于SQL的执行方式,需要在工作中不断积累经验。


共2页: 上一页 [1] 2 下一页
(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:oracle系统紧急故障处理方法  
下一篇:关于Oracle数据库中索引的维护经验谈
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号