ORACLE LATCH
LATCH:oracle用于保护内存结构,保证数据在读取的时候,只能由一个会话来完成。
LATCH:轻量级锁,不会造成阻塞,会导致等待。
系统缓慢原因是LATCH:
1. 共享池中LATCH争用 --> 绑定变量;
如果字段上有索引或者字段集较大,不建议用绑定变量
a. 如何绑定变量:
declare
i number;
begin
for i in 1..1000 loop
insert into t values(i,i+1,i*1,i*2,i-1);
end loop;
end;
或者:
declare
i number;
sqlstr varchar2(200);
begin
for i in 1..1000 loop
sqlstr:='insert into 测试表 (:i,:i+1,:i*1,:i*2,:i-1) ';
execute immediate sqlstr;
end loop;
end;
b. 如何判断是否绑定变量:
select substr(sql_text,1,20), count(*)
from v$sqlarea
group by substr(sql_text,1,20) having count(*) > 50;
from v$sqlarea
group by substr(sql_text,1,20) having count(*) > 50;
2. 数据缓冲池LATCH争用 --> 热块存在;
a. 表数据块 --> 将表数据分布到更多块上,缺点读取的性能变差。
命令:alter table minimize records_per_block;
b. 索引数据块 --> 多发生在RAC系统中,建立反向索引
命令:create index <索引名> on <表名>(<字段名>) reverse;
c. 索引根数据块 --> 第一二级索引被频繁访问,建立索引分区。
d. 文件头数据块 -->
Oracle 9i以前:记录数据块是否空闲的Free List(PCT_FREE参数决定数据块使用到多大比例从Free List中剔除,多大比例重新加入Free List)--> 增加Free List的数量
Oracle 9i及以后:引入ASSM(Automatic Segment Space Management)自动段管理技术,有效解决文件头数据块热块问题。
Comments
Post a Comment