一. 优化要考虑的方面
1. 程序自身设计;
2. SQL语句优化:
1) 通过 v$librarycache 了解命中率,
这和下面提到的Shared Pool有关系,避免重复解析SQL语句,有助于提高数据库性能。
2) 使用 “物化视图” 提高查询性能。
3. 数据库优化;
4. 操作系统优化;
5. 硬件优化,这里涉及到的硬件主要有:硬盘,内存。
1) 硬盘的读写速度:建议增加硬盘的数量,从而增加每秒的并发操作。 2) 内存大小。
二. 数据库优化
1. 根据数据库的使用方式得出合理的优化策略
1) OLTP:连机事务处理。
需要实时处理大量请求,而每次处请求的数据量都是很小的。
OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
性能好坏的重要指标:响应时间与请求处理并发数。
2) OLAP:联机分析处理。
可以简单地理解为在海量数据中得出统计/综合信息,是数据仓库的主要应用。
做OLAP应用的数据库,数据量通常量非常大。
和OLTP不同,OLAP 应用的并发处理量是很低的,所以基本不用考虑并发问题。
而在处理数据量方面,OLAP每次操作所需要处理的数据量通常都是非常大的,这点也和OLTP相反。
性能好坏的重要指标:查询大量数据的速度。
注:由于OLTP和OLAP是两个不同应用方向,所以在优化数据库时应采取不同的优化策略。
2. 内存分配比例:2 : 1 : 1
内存分配的较佳方案:
1) SGA占50%的物理内存,
2) PGA 和 操作系统 各占25%的物理内存,
当然这也不是绝对的,
但是SGA占的物理内存不能超过75%,最多只能占70%,否则Oracle可能会出现各种的异常。
3. SGA中各个POOL的内存分配
1) Shared Pool:要分配多少内存不定,只要满足以下两个条件即可:
- Lib Cache的命中率 > 98%
- Data Dictionary Cache的命中率>85%
2) Large Pool:
- 专用服务器:100-200M
- 共享服务器:Session * (Sort_area_size + 2)
3) Java Pool:无需使用,一般不分配空间。
4) Redo Log Buffer Cache:小于5M,因为它的信息非常重要,应尽快把缓存数据写到文件中。
5) DB_Buffer_Cache:尽量大。
4. 在Oracle 10g中,
如果我们定义了SGA_MAX_SIZE后,
其实我们通过SGA_TARGET让Oracle自动调整SGA的内存分配。
5. Redo log files,Data files,Archive log files尽量放在不同的磁盘上,以均衡I/O。
特别是Redo Log files和Archive log files。
6.Undo Segment容量大小要符合实际应用,不能太小。
7.热点文件特殊处理
1) 分开存放 Index Segment 和 Data Segment。
2) 使用分区表。
8. 索引(Index)问题
1) 适当使用BTREE,BITMAP以及反向索引:不同索引适用于不同的表,设置索引之前要考虑这个问题。
2) 一个表的索引数最多不要超过5个,否则可能影响性能。
3) 定期重构索引。(单边树索引重构时可考虑使用反向索引降低索引树高度)
4) 注意索引是否失效,这一般是比较烂的SQL语句引起的问题。
9. 尽量减少 “全表扫描操作” & “排序操作”
10. 看执行计划有助于各位DBA找出性能问题。
由于oracle10g简化了配置参数,而且提供自动根据数据库访问情况对各类缓存进行分析优化的功能,因此在oracle参数这层进行优化主要有以下几点。