1 / 33
文档名称:

Oracle数据库性能优化实务_闩锁及闩锁优化.ppt

格式:ppt   页数:33
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Oracle数据库性能优化实务_闩锁及闩锁优化.ppt

上传人:yunde113 2014/5/8 文件大小:0 KB

下载得到文件列表

Oracle数据库性能优化实务_闩锁及闩锁优化.ppt

文档介绍

文档介绍:Oracle数据库性能优化实务 第四讲:闩锁及闩锁优化
主讲人:白鳝
华章培训网、[训网版权所有
Oracle的锁
第2页
应用级锁:应用中对表等资源进行锁定,保证业务逻辑正确性
数据字典锁:Oracle RDBMS内核程序员使用的用来保证数据字典访问逻辑正确性的锁
内存控制锁:用来保护Oracle内部数据结构的锁(LATCH,MUTEX)
应用程序的锁
第3页
应用程序锁的优化取决于应用软件编写人员
使用v$lock可以观察锁的情况(TM,TX)
?/rdbms/admin/
使用dba_waiters,dba_blockers来查找阻塞
数据字典的锁
第4页
Oracle RDBMS也是一个“程序”,需要通过锁机制来保证程序的逻辑
$$等数据字典表
类似这些操作也会在v$lock看到
锁的名字是特殊的
管理共享内存的锁
Oracle的内存结构也必须进行同步互斥保护
Oracle通过对访问核心内存结构的代码的执行进行控制来达到间接的保护核心内存的目的
每个LATCH都涉及到特定的内核代码
要执行某个代码,必须先获得相应的LATCH
Oracle通过上述过程,可以保证核心内存访问的高效性和一致性
什么是闩锁
Latch可以保证Oracle串行访问核心内存
Latch必须十分高效
Latch通过简单的底层的技术实现,尽可能使用操作系统的底层技术
Latch的申请不通过队列机制
闩锁的使用
If get_latch(‘latch name’, mode)
{
--执行某段内核代码
release(‘latch name’);
}
MUTLI-LATCH
Oracle对特定的内核内存只使用一个LATCH来保护
如果某些内核内存太大,Oracle会分为一些子区域,每个子区域由一个LATCH来管理,比如:
多个相同功能的LRU LATCH用来保护多条LRU链
多个HASH LATCH来保护多条HASH 链
一个LATCH可以保护多个内核内存区域,但是一个内核内存区域只有一个LATCH
LATCH的模拟算法
Function Get_Latch(latch_name,mode){
If Mode eq ‘immediate’{
If Fast_Get(latch_name) {
return TRUE
Else {
return FALSE
}
}
Else {
If Fast_Get(latch_name){
return TRUE
}
Else {
while ( 1 == 1 ){
if Spin_Get(latch_name){
return TRUE
}
Else {
Register_Event(“latch: $latch”)
Sleep(try++)
}
}
}
}
}
Function Fast_Get(latch_name)
{
If try_to_get_latch(latch_name){
return TRUE
}
Else {
return FALSE
}
}
Function Spin_Get(latch_name)
{
for i = 1 to _spin_count{
If Fast_Get(latch_name)
{
return TRUE
}
}
}
Function Sleep(try)
{
sleeptime =
decode(try,0,0,1,10,2,20,3,~40,4,~80,...~2000)
sleep(sleeptime)
}
LATCH相关的时间开销
三个方面消耗的时间:
获取LATCH的时间(SPIN:CPU时间,SLEEP等)
持有LATCH的时间(内核代码:cpu时间,OS调用,锁等待)
LATCH释放的时间(内核代码:cpu时间)
注意的要点:
spin消耗CPU资源,因此提高_spin_count会加大CPU开销
spin不产生等待事件
sleep不消耗cpu时间,会记录latch free等待