首页 > 数据库 > Oracle > Latch free等待事件(三)
Oracle 10g 操作系统solaris | |||||||
Db_cache_size | 32m | 64m | 128m | 256m | 512m | 1024m | 2048m |
_ksmg_granule_size | 4m | 4m | 4m | 4m | 4m | 16m | 16m |
_db_block_buffers | 3976 | 7952 | 15904 | 31808 | 63616 | 127232 | 254464 |
_db_block_hash_buckets | 8192 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 |
_db_block_hash_latches | 1024 | 1024 | 1024 | 1024 | 1024 | 1024 | 2048 |
Oracle9i 操作系统solaris | |||||||
Oracle 10g 操作系统solaris | |||||||
Db_cache_size | 32m | 64m | 128m | 256m | 512m | 1024m | 2048m |
_ksmg_granule_size | 4m | 4m | 4m | 4m | 4m | 16m | 16m |
_db_block_buffers | 3976 | 7952 | 15904 | 31808 | 63616 | 127232 | 254464 |
_db_block_hash_buckets | 8192 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288 |
_db_block_hash_latches | 1024 | 1024 | 1024 | 1024 | 1024 | 1024 | 2048 |
Oracle9i 操作系统solaris | |||||||
Db_cache_size | 32m | 64m | 128m | 256m | 512m | 1024m | 2048m |
_ksmg_granule_size | 4m | 4m | 16m | 16m | 16m | 16m | 16m |
_db_block_buffers | 4000 | 8000 | 16016 | 32032 | 64064 | 128128 | 256256 |
_db_block_hash_buckets | 8009 | 16001 | 32051 | 64067 | 128147 | 256279 | 512521 |
_db_block_hash_latches | 1024 | 1024 | 1024 | 1024 | 1024 | 1024 | 2048 |
Oracle8i 操作系统solaris | |||||||
Db_block_buffers | 4000 | 8000 | 16016 | 32032 | 64064 | 128128 | 192192 |
_db_block_hash_buckets | 8000 | 16000 | 32032 | 64064 | 128128 | 256256 | 384384 |
_db_block_hash_latches | 1024 | 1024 | 1024 | 1024 | 1024 | 1024 | 2048 |
Cache buffers chains latch争用原因一 ―― 低效的sql语句
低效的sql语句是导致cache buffers chains latch争用的主要原因。在高并发系统中, atch free时间可能因此非常明显。典型的情况是,应用程序开启多个并发会话执行相同的低效sql,并且访问同样的数据集。
你应该时刻铭记下面三点:
n 每次逻辑读都需要请求一次latch。
n 只有获得某个latch之后才会停止对该latch的不断请求。
n 在某个时刻,只有一个进程可以获得cache buffers chains latch,而该latch可能用于保护很多的数据块,其中的某些块可能正在被其他进程请求(当然,前面也已经提过,oracle9i允许只读性质的cache buffers chains latch共享)。
一般而言,较少的逻辑读意味着较少的latch请求,也就意味着较少的latch争用和更好的系统性能。所以,你应该找出导致cache buffers chains latch争用的低效sql语句,优化这些语句,尽量降低其逻辑读。那些buffers_get/executions比值较大的sql可能就是你需要调整的语句。
注1:某些dba可能通过修改隐含参数_db_blocks_hash_latches来增加系统中cache buffers chains latch的个数,而不是首先去优化低效的sql语句,这是不正确的,增加latch能暂时降低对latch的争用,但这是治标不治本的方法。
注2:在sun solareis平台上,我们将一个数据库从oracle8.1.7.4升级到oracle9.2.05之后,发现了大量的cache buffers chains latch争用,新的优化器为应用程序生成了低效的执行计划。一些隐藏的优化器相关的参数,在oracle8i中是无效的,但在oracle9i中有效。在重设这些参数后,问题得意解决。如果你遭遇到同样的情况,建议请求oracle的技术支持。
Cache buffers chains latch争用原因二 ―― 热点块
热点块是导致cache buffers chains latch争用的另外一个主要原因。当多个进程重复访问一个或多个由同一个cache buffers chains latch保护的块时会导致该问题。这通常是应用程序引起的。在这种情况下,增加cache buffers chains latch的个数对热点块导致的争用没有什么作用。因为数据块分布在哪个hash bucket和hash chain上是由块地址(dba:data block address)和hash bucket的个数决定的,和hash latch的个数没有关系。只要块地址和ha
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34329/viewspace-916688/ ,如需转载,请注明出处,否则将追究法律责任。