ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PERF--Oracle 结构化查询语言(SQL)和索引核心:必要时再次访问

PERF--Oracle 结构化查询语言(SQL)和索引核心:必要时再次访问

原创 Linux操作系统 作者:vongates 时间:2019-06-14 22:54:04 0 删除 编辑

本文是有关Oracle 10g基于成本的内部优化(CBO)核心和结构化查询语言(SQL)性能最优化的一系列文章(共12部分)中的第9部分。每个技巧类的文章都摘录自即将由Rampant科技出版社出版的书《Oracle 结构化查询语言(SQL)和索引核心》,作者是Kimberly Floss。从该系列的主页上,你能看到其他即将发布的部分。

必要时再次访问


如果你是一个数据库开发者,你或许认为一旦你把你的SQL代码发布成产品,你的工作就结束了。在某些情况下你或许是正确的。但是,更通常的情况是,一个数据库管理员接手你的工作,并被任命为“哨岗”来监视并识别那些可能成为系统瓶颈的SQL代码。但是,当某天你编写的曾经运行良好的SQL代码交还给了你并命令你重新修改它时,请不要惊讶。为什么会发生这种情况?曾经运行快速的代码变得很迟缓在一下情况中是很常见的:

* 数据量的改变――对于含有少量数据的对象运行良好的代码,当这些对象的数据量变大时,代码可能会变得像蜗牛爬行一样慢。

* 索引找不到了――有时候,数据库管理员会删除某个索引,而这个索引的删除将导致数据库的插入、更新和删除操作变得很慢。非常不幸的是,这个索引对于你编写的查询能否成功起着关键性作用,那么你就必须和数据库管理员共同商讨一个应付这种情况的折中办法。

还有其他很多情况下,曾经运行良好的某个SQL查询变得不再可用。你必须时刻准备好重新查看你的备忘清单,并查看可能会出现的契机。

如果你是一个数据库管理员,你或许非常想知道如何快速定位某个系统中的运行效率很差的SQL代码。如果某个Oracle数据库可疑,你可以使用下面的代码来找出那些运行效率很差的SQL代码。下面的代码会搜索Oracle共享池,并根据每次执行时读磁盘的次数(一个非常标准的经验方法)来对SQL代码进行等级划分:

SELECT A.SQL_TEXT ,
B.USERNAME ,
ROUND((A.DISK_READS/DECODE
(A.EXECUTIONS,0,1,A.EXECUTIONS)), 2),
A.DISK_READS ,
A.BUFFER_GETS ,
A.PARSE_CALLS ,
A.SORTS ,
A.EXECUTIONS ,
A.ROWS_PROCESSED ,
A.FIRST_LOAD_TIME ,
A.SHARABLE_MEM ,
A.PERSISTENT_MEM ,
A.RUNTIME_MEM
FROM SYS.V_$SQLAREA A,
SYS.ALL_USERS B
WHERE A.PARSING_USER_ID=B.USER_ID
ORDER BY 3 DESC

结束语

如果Jeff现在仍然在写SQL查询,我确信他现在的编码水平比1993年时要高很多。为了确保你不要重蹈他当年的覆辙,请遵循下面列出的一个简单的SQL备忘清单。虽然它不是一个详尽的包含一切的清单,但是,对于在编写数据库代码时发现并解决数据库代码中的问题,它可作为一些应该遵循的基本步骤,同时还是一个非常有帮助的提醒。

* 验证SQL代码的有效性
* 更新并理解关键对象的统计信息
* 解释并理解访问路径
* 纠正明显的错误
* 使用各种各样的技术和技术组合来重写SQL代码
* 对重写的SQL代码进行评测
* 基于消耗的时间和输入输出开销(正常情况下)选择最优选项

很明显,我们的目标是发现使系统陷入困境的SQL代码,并修复它。方法很多,例如,根据上面给出的观点修改你的代码,或者对系统运行STATSPACK命令,找出最上面的SQL语句,或者使用Oracle 10g新的“顾问”来通知你SQL代码的问题所在。

这些都是很昂贵的。STATSPACK能识别出开销最大的SQL代码,但是,STATSPACK包在更高级别上是非常消耗资源的,它可能会引起额外的问题。通过v$sqlarea可以识别出系统中开销最大的SQL代码,也可以使用第三方工具,例如Quest公司的软件(TOAD, SQL*Lab, SQL*Navigator)。

当然,解决问题的下一步是对任何运行效率低下的语句执行解释(explain)命令,以确保它的访问路径正确。然后你就可以开始修复那条SQL语句了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29987/viewspace-51850/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-09-11

  • 博文量
    448
  • 访问量
    290414