最近在看performance的问题,然后吸收了点oracle相关的知识。就是下面这本书。不知哪位前辈留下的,拿来看看。
SGA:系统全局区,是一个所有oracle会话都可访问的共享内存区域。包含:缓冲池,共享池,大池,Java池,重做缓冲区以及较小的重做缕。(最近系统刚加)
虚拟索引:没有创建对应的物理实体的索引。目的在于不必耗时、耗CPU、耗IO以及消耗大量存储空间去实际创建索引的情况下,来判断一个索引是否对sql起到优化作用。
alter session set "_use_nosegment_indexes"=TRUE;
session altered.
create index idx_buf_id on sales(quantity_sold) nosegment;
nosegment选项表明这个索引是虚拟的。
逻辑模型到物理模型的映射
将逻辑子类转化为表的时候,要避免采用分开的父类表和子类表的方法,而要选择将所有子类映射为一个表,或采用单独的子类表而没有父类表的方式。
可选的属性和NULL值
B*索引不能存储NULL,需要全表扫描来查找NULL值。
采用NULL可以降低行的平均长度,从而一定程度上提高全表扫描的性能。
函数索引
看到系统中大部分sql都有使用upper(pk_id),一开始还挺奇怪,这样是不是有额外的开销,会走pk_id索引吗?后来查看db的函数索引得知已经存在upper这样的函数索引。函数索引基于函数或表达式的索引。但是要求函数与表达式必须具备确定性。可以使用deterministic关键字来表明它将总是返回同样的值。
create or replace function days_left(p_eff_date DATE)
return number
IS
BEGIN
return (p_eff_date - sysdate)
END;
/
这种其实是不对的,因为days_left会随着时间的变化而变化。
外键与锁
当父表发生主键变更或者记录删除时,除非在外键字段上创建了索引,否则Oracle会在子表上应用表级锁,而不是行级锁。
nest loops
先取出第一个表中的数据,然后拿取出的数据每一行匹配第二次取出的表进行连接,以此循环。驱动表中取出的多少行数据,被驱动表就会被访问多少次。被驱动表加索引有效果。
hash join
两个表个hash运算,然后按照hash的结果做表连接。每个表最多被访问一次。连接方式等值连接,不支持不等值连接。适用于等值连接,且连接列没有索引(不一定)。索引不一定有效。hash_area_size 调整有效果。show parameter hash。
sort merge join
先两表各排序,然后在连接。连接方式绝大多数的等值连接,支持<或者>这样的不等值连接,其他的不等值不支持。适用于两表返回的数据量不确定,或者两个结果集基本有序。以小表驱动有优势。