优化规则:
1 RBO:基于规则优化
遵循的是Oracle内部预定的一些规则,譬如查询走索引等
2 CBO:基于成本优化
ALL_ROWS为默认的优化方法,是以数据的吞吐量为主要目标,以便可以使用最少的资源完成语句。
FIRST_ROWS为第二种优化方法,是以数据的响应时间为主要目标,以便快速查询出开始的几行数据。
3 CHOOSE:选择性
实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器.
访问table的方式:
ORACLE 采用两种访问表中记录的方式:
a. 全表扫描
全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.
b. 通过ROWID访问表
可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.
内部函数提高处理效率:
Decode函数:DECODE(col/expression, search1, result1
[, search2, result2,...,]
[, default])
NVL
使用commit:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
用where替代having子句
用exsits替代in/distinct
用表连接替代exsits
使用显示的游标;
建立索引,常用规则:
1、表的主键、外键必须有索引;
2、数据量超过700的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
基于索引的优化方法:
A. 不要在一张表上建立太多的索引
过多的索引会影响插入,更新等,带来资源额外开销过多
B. 不要对索引列进行操作
如 where to_char(expdate) > ‘20071201’
应修改为 where expdate> to_date(‘20071201’,’yyyymmdd’)
C. 特定的条件下强制某些索引失效
如 where exptype||’’ > ‘1’
D. 增加查询的范围限制
将 >3 替换为 >=4
E.尽量去掉“IN”、“OR” 、“<>”
F.like子句尽量前端匹配
后端匹配和中间匹配将不使用索引
G.用Case语句合并多重扫描
H.使用nls_date_format
alter session set nls_date_formate=’MM’;
建立分区表 :
分区表是按照特定方式逻辑划分大表,最终将其数据部署到几个相对较小的分区段中。执行SQL语句访问分区表时,服务器进程可以直接访问某个分区段,而不需要访问整张表的所有数据,从而降低磁盘I/O,提高系统性能。