数据库管理员需要根据自己的信 息系统的类型着重考虑不同的数据库参数。 1、1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update 操作,典型的系统包括民航机票发售系统、银行储蓄系统等。OLTP 系统需要保证数据库的 并发性、可靠性和最终用户的速度,这类系统使用的ORACLE 数据库需要主要考虑下述参 是否需要建立ORACLE数据库索引、聚集、散列? SQL语句是否高效? 2、2、数据仓库系统(Data Warehousing),这种信息系统的主要任务是从ORACLE 的海量 数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的ORACLE 是否采用B*-索引或者bitmap索引? 是否采用并行SQL查询以提高查询效率? 是否采用PL/SQL函数编写存储过程? 有必要的话,需要建立并行数据库提高数据库的查询效率SQL 语句的调整原则 SQL 语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效 率是很不相同的。程序员可以使用EXPLAIN PLAN 语句来比较各种实现方案,并选出最优 的实现方案。总得来讲,程序员写SQL 语句需要满足考虑如下规则: 1、1、尽量使用索引。试比较下面两条SQL 语句: 语句A:SELECT dname, deptno FROM dept WHERE deptno (SELECTdeptno FROM emp); 语句B:SELECT dname, deptno FROM dept WHERE EXISTS(SELECT deptno FROM emp WHERE dept.deptno emp.deptno);这两条查询语句实现的结果是相同的,但是执行语句A 的时候,ORACLE 会对整个emp 进行扫描,没有使用建立在emp表上的deptno 索引,执行语句B 的时候,由于在子查询中 使用了联合查询,ORACLE 只是对emp 表进行的部分数据扫描,并利用了deptno 列的索引, 所以语句B 的效率要比语句A 的效率高一些。 2、2、选择联合查询的联合次序。考虑下面的例子: SELECT stuff FROM taba WHEREa.acol between :alow b.bcolbetween :blow c.ccolbetween :clow b.key1AMD a.key2 c.key2;这个SQL 例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描, 所以主表应该数据量最小,所以例子中表A 的acol 列的范围应该比表B 3、3、在子查询中慎重使用IN或者NOT exists的效果要好的多。 4、4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查 询最好都分解为对数据表的直接查询效果要好一些。 5、5、可以在参数文件中设置 SHARED_POOL_RESERVED_SIZE 参数,这个参数在 SGA 共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL 程序包。 6、6、ORACLE 公司提供的 DBMS_SHARED_POOL 程序可以帮助程序员将某些经常使用 的存储过程―钉‖在SQL 区中而不被换出内存,程序员对于经常使用并且占用内存很多的存 储过程―钉‖到内存中有利于提高最终用户的响应时间。 CPU 参数的调整 CPU 是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时 CPU 的使用率在 90%以上。如果空闲时间 CPU 使用率就在 90%以上,说明服务器缺乏 CPU 资源,如果工 作高峰时CPU 使用率仍然很低,说明服务器CPU 资源还比较富余。 使用操作相同命令可以看到CPU 的使用情况,一般UNIX 操作系统的服务器,可以使用sar 命令查看CPU的使用率,NT 操作系统的服务器,可以使用NT 的性能管理器来查看CPU 的使用率。 数据库管理员可以通过查看 v$sysstat 数据字典中―CPU used session‖统计项得知ORACLE 数据库使用的CPU 时间,查看―OS User level CPU time‖统计项得知操作系统用户 态下的CPU 时间,查看―OS System call CPU time‖统计项得知操作系统系统态下的CPU 间,操作系统总的CPU 时间就是用户态和系统态时间之和,如果 ORACLE 数据库使用的 CPU 时间占操作系统总的CPU 时间90%以上,说明服务器CPU 基本上被ORACLE 数据库 使用着,这是合理,反之,说明服务器CPU 被其它程序占用过多,ORACLE 数据库无法得 到更多的CPU 时间。 数据库管理员还可以通过查看v$sesstat 数据字典来获得当前连接ORACLE 数据库各个会话 占用的CPU 时间,从而得知什么会话耗用服务器CPU 比较多。 出现CPU 资源不足的情况是很多的:SQL 语句的重解析、低效率的SQL 语句、锁冲突都会 引起CPU 资源不足。 1、数据库管理员可以执行下述语句来查看SQL 语句的解析情况: SELECT FROMV$SYSSTAT WHERE NAME ('parsetime cpu', 'parse time elapsed', 'parse count (hard)'); 这里parse time cpu 是系统服务时间,parse time elapsed 是响应时间,用户等待时间 waite time parsetime elapsed parsetime cpu 由此可以得到用户SQL 语句平均解析等待时间=waite time parsecount。这个平均等待时间 应该接近于0,如果平均解析等待时间过长,数据库管理员可以通过下述语句 SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA ORDER PARSE_CALLS;来发现是什么SQL 语句解析效率比较低。程序员可以优化这些语句,或者增加ORACLE 2、数据库管理员还可以通过下述语句:SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA; 查看低效率的SQL 语句,优化这些语句也有助于提高CPU 的利用率。 3、3、数据库管理员可以通过v$system_event 数据字典中的―latch free‖统计项查看ORACLE 数据库的冲突情况,如果没有冲突的话,latch free 查询出来没有结果。如果冲突太大的话, 数据库管理员可以降低spin_count 参数值,来消除高的CPU 使用率。