复杂应用环境下监控Oracle数据库性能(1)(2)
上面的数据库操作开销的计算仅限于对时间消耗的计算,对同时使用同一数据库的其它应用软件的影响,对磁盘操作的频繁程度,数据库操作所采取的具体策略等等因素,都未考虑在内,高级语言也不可能提供这样的参考数据.而数据库本身提供的监测手段弥补了这一不足.最简单的操作控制台:
|
将为每次执行的数据库操作进行计时,精度为1/100秒,笔者对该功能的使用中发现其时间的计算也有一定的偏差.而且时间偏差很大,严格说来,已不属于误差的范围,该归错误了,下面是一个例子中得到的数据:
|
从系统的时间差来看,为4秒左右,但ORACLE却报告了6.16秒!如果说ORACLE工具在时间计算上太差强人意的话,在SQL语句的执行方案上可算是对SQL语句如何执行的最权威的诠释了.解读这样的信息需要对ORACLE内部对SQL操作的过程有一定了解,下面是该功能的一样典型示例:
|
Execution Plan下的信息显示ORACLE制定了一个什么样的计划来完成SQL操作的,SQL语言是一种4GL语言,其特点是告诉系统做什么,而不提供如何做的信息。当然,最终的具体工作总得有人做的,只是由数据库自动制定而不是程序员人为指定一个具体的操作步骤,制作这个步骤当然要有所依据,ORACLE有两个基本原则来决定如何优化:cost-based(基于开销的优化)和rule-based(基于规则的优化)。基于开销的优化的工作方式依赖于数据库对SQL语句所操作的数据对象(可简单认为就是表)的数据特征的统计特性进行收集和分析。收集分析的工作由DBA来定期执行,时间间隔依数据变化频率而定,以保持统计数据一定的准确性,具体操作请参照analyze语句。Oracle准备在将来的版本中取消对基于开销的优化方案的支持,因为这种方案需要大量的数据收集与分析工作,且总会有一定的误差,这造成最终的执行方案往往不是最优的。
基于规则的优化则是依据一些数据操作效率的规则进行选择,优化的核心在于效率,时间上尽可能短,空间上尽可能少进行IO操作。两种优化方案都绝非十全十美,ORACLE虽将其称为优化方案,笔者的观察结果表明,ORACLE制定出一个不是最优或错误的执行方案也是完全可能的。以上为例,Oracle的优化策略是Choose,所谓Choose就是cost-based或rule-based,让ORACLE自己选择,可以通过数据库启动初始化文件initXXX.ora文件中的optimizer_mode参数来指定。
言归正传,上面的具体策略是Oracle对该表的一个唯一索引进行全扫描,因为在数据库里一个字段如果可以建立一个UNIQUE类型的索引,那么它就与表中的记录有一一对应的关系。所以对该索引进行count(*)可以保证其值等于对表进行count(*)操作。对索引进行全扫描后的上层操作是一个集合操作,即对找到的每个索引记录进行计数。对这些信息的观察主要用来确定ORACLE是否选用了SQL程序员希望ORACLE选用的索引操作。
Statistics给出了执行该SQL操作所消耗的资源的统计数据,信息的表达一目了然,所有这些值都是越小越好,以通过SQL*Net的数据吞吐量为例,在OCI编程中使用以下技术可显著减少网络流量:通过将Commit操作与Execute操作绑定为一个操作。通过对数组进行成批数据的delete,insert,update,通过对一个SELECT语句指定一个预取记录数。这些统计数据中,尤其需要避免的是涉及磁盘存取的操作,因为多级存储的操作速度是CPU>>Memory>>HD>Disc>network>disk。
2. 对投入运营的系统中PHP程序的监控
理想的开发流程是设计->文档->编码->测试->投入使用,但实际运行的系统往往是由良莠不齐的程序所组成,有些缺乏文档,有些可读性差,有些程序极为脆弱。对于这样的既成事实,如果系统中出现了瓶颈,不可能一条语句一条语句地来进行测试,只能是用一种统一的方法定位主要问题的所在。由于PHP程序中的SQL语句使用了所谓动态SQL语句,即用户可以在程序运行时动态生成一个SQL语句,所以如果对静态的PHP程序文件进行。



