• 在调优以前应该思考的问题
应该由谁来进行调整?
 
      1、应用程序设计者
        2、应用程序开发者
        3、数据库管理员
        4、系统管理员
        5、网络管理员
为什么要进行调整?
调整的量化目标是什么?

在我们能够正确的回答这些问题以前,请不要去调整ORACLE数据库。
   
一、应该由谁来完成性能调整?
首先,当我们发现访问ORACLE数据库变得缓慢的时候,通常的原因有几类:
    可能是网络因素,比如网线接触不良或双机间网络性能低下,造成查询发生时数据传送缓慢;
    也有可能是系统因素,由于系统设置不当,使系统IO量很大,ORACLE得不到必要的IO资源;
    有可能是数据库本身的参数设置不当,或是过旧与损坏的索引,或是导入方式不当,使ORACLE不能充分发挥自己的作用;
    也有可能是应用程序开发者所编写的SQL语句性能低下,比如对大数据量的表进行全表扫描等等;
    整体软件设计也会影响到数据库性能,比如可以拆分的业务却设计到了一起,造成数据量巨大。
 
    调优前,这些要有充分的心理准备,不要一开始就把问题定位在哪一个环节上,可能会造成错误的判断从而更严重的毁坏性能和稳定性。

二、为什么要进行调整?
    当找到了问题产生的节点,我们做为既定的角色去解决性能问题时,我们也必须回答这样一个问题:为什么要进行调整?
可能的原因是:我觉得它慢。  但这是一个不正确的理由,应该提出一些量化的指标,比如说某个在线事务中,某个查询需要200秒的时间,从业务上讲这是不可容忍的,再比如某个统计可能将系统资源占空,从而妨碍甚至阻塞了其他在线业务的正常进行等等,从硬件资源和时间性能上下一个定义,做为调整的理由是合适的。
 
    需要注意的是,这个问题是调优者自己提出来的,而不是用户,调优者必须和用户沟通,进行调优前的性能确认,以至双方达成对现有性能的量化认可。

三、调整的量化目标是什么?
    调优的过程不是我们在上网,调调网速,好了就这么着,不好再调回来。对ORACLE参数和结构所做的任何调整可能是有益的,也可能带有破坏性!调优的目标是无限的,好了还能再好,好到什么程度就是可以了呢? 不要做“好了还能再好”的事情,有可能会破坏整体性能!打个简单的比方,一个有50个字段的大表,为时间字段建立正确的索引,就可以把一个本来需要20秒的查询降到3秒,这个是可以容忍的速度,根据数据的变化看,用户可接受的时间是在6秒以内,数据增长在一年内不会突破这样的时限,那就可以了,为所有字段增加索引当可能对其他并没有性能问题的查询有提速的效应,然而,却为插入和更新删除等操作带来巨大的负担!
    Oracle对于调优的忠告是:调优过程是渐进的、阶段式的,没有一劳永逸的调优。

    在动手以前,确认用户容忍的性能范围的量化值,达成一至性的意见,毕竟巨大的数据量在眼前,无限制的加速是不可能的事情。


    在整个思考过程中,最重要的两件事就是量化问题和良好沟通!
    在行动以前,别忘了备份现有的参数、结构和数据库!
 
 
Oracle的基本参数调优
 
 
一般刚刚安装完的Oracle其默认配置是针对配置较低的电脑的,经过一些参数上的调整,可以大大提升其运行的性能。 但是,这些参数只能是让计算机更好的发挥资源优势,对于拥有巨大的数据量的系统来说,这些参数不能起决定性的作用。比如当一个主机的内存仅有1GB的时候,如果单次查询所使用的内存都比1GB大,那么直接I/O是不可避免的! 也就是说,这些参数的调优是针对系统的,让系统充分发挥性能,而巨大的数据量所需要的调整往往在于SQL语句和结构的优化上,参数本身只能保证系统可以充分利用操作系统及硬件资源。
    参数调整更像是系统级优化,而非数据库数据级优化,在大数据量的系统上,往往看不出什么效果来。
一、确定我们的系统是使用spfile启动的(9i以上):


对于Oracle 9i以上的版本,首先要查看一下系统当前使用的配置是否是spfile;

首先,以sysdba权限登录到系统,查看当前使用的配置是spfile还是pfile:

SQL> conn / as sysdba
Connected.
SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ -----------
spfile                               string
      ?/dbs/spfile@.ora

注意蓝色部分,如果与此非常相像,则说明是spfile,否则是pfile。

如果是spfile,则首先创建一个pfile来备份,以免修改错误不能启动:

SQL> create pfile from spfile;

File created.


这时pfile被创建。

如果是pfile,我们可以改用spfile启动,使用下面的方法创建spfile, 并重新启动:

SQL> create spfile from pfile;

File created.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area  630501376 bytes
Fixed Size                  2147032 bytes
Variable Size             452988200 bytes
Database Buffers          167772160 bytes
Redo Buffers                7593984 bytes
Database mounted.
Database opened.


二、开始调整:
我们仅以流行的4GB内存,32位系统为例:

增大系统全局区:
SQL> alter system set sga_max_size=1200m scope=spfile;

增大数据缓存区:
SQL> alter system set db_cache_size=700m scope=spfile;

增大共享内存区:
SQL> alter system set shared_pool_size=320m scope=spfile;

增大程序全局区:
SQL> alter system set pga_aggregate_target=500m scope=spfile;

增大排序区:
SQL> alter system set sort_area_size=30000000 scope=spfile;

增加连接数量:
SQL> alter system set processes=600 scope=spfile;

三、注意事项:
    在32位的系统上,ORACLE的SGA+PGA区的大小是不能超过1.7GB的,需要特别的调整,但除非必要一般不推荐这么做。但是,根据以往的使用经验,SGA区在WINDOWS下开到1.5G以上就有可能不稳。
    shared_pool_size 与 db_cache 都在SGA内,所以这两项的大小加在一起一定要小于SGA。