设为首页 加入收藏

TOP

ORA-00382与DB_nK_CACHE_SIZE参数设置
2015-08-31 19:59:47 来源: 作者: 【 】 浏览:42
Tags:ORA-00382 DB_nK_CACHE_SIZE 参数 设置

最近在尝试优化一个包含blob字段表的查询,考虑使用非标准块缓存。但是,在尝试设置DB_32K_CACHE_SIZE参数时,遭遇报错(报错内容:ORA-00382: 32768 不是有效的块大小, 有效范围为 [..])。于是,到官方文档查了一下,才明白这个参数的设置由于和底层数据块相关,与操作系统是紧密相连的。在Windows操作系统下,DB_32K_CACHE_SIZE参数时不可用的,但是,它支持DB_16K_CACHE_SIZE。


这里给出参数的官方文档说明以及具体的操作过程,仅供参考。


官方文档说明DB_nK_CACHE_SIZE


DB_nK_CACHE_SIZE (其中 n = 2, 4, 8, 16, 32) 指定了nK缓存区的大小。你可以设置除DB_BLOCK_SIZE之外的其他数值。例如,如果DB_BLOCK_SIZE4096,那么你设置DB_4K_CACHE_SIZE就是非法的(因为4K的缓存区大小已经被DB_CACHE_SIZE参数设置过了)


如果数据库中存在nK块大小的在线表空间,那么不能设置该参数为0


操作系统会限制特定的块大小。例如,如果操作系统最大块尺寸小于32KB,那么你不能设置DB_32K_CACHE_SIZE参数。同样,如果最小块尺寸大于2KB,那么你也不能设置DB_2K_CACHE_SIZE参数。


根据官方文档的解释,这就意味着我们是无法设置DB_8K_CACHE_SIZE参数的,否则会报错,如下所示:


根据官方文档的说明,默认情况下DB_nK_CACHE_SIZE参数的值都是0,我们可以查看一下所有与cache size相关的参数。


我尝试把DB_32K_CACHE_SIZE参数修改为200M,遭遇报错。


现在明白了,这个参数的设置和操作系统紧密相关。既然无法设置DB_32K_CACHE_SIZE,也就是说,Windows Server 2008 Standard R2操作系统的最大块尺寸是小于32K的。


那么,接下来我们尝试设置DB_16K_CACHE_SIZE参数。


从结果来看我们是设置成功了,但是我们明明设置的是200M,为什么查出来的是208M呢?这个我们也可以从官方文档的说明中找到答案——“如果值大于0,会自动修改为内存颗粒大小*处理器个数,或者4MB*CPU个数,取二者较大值”。我看了一下系统的硬件配置,双核*12CPU,也就是有24CPU。那么,内存颗粒大小即granule又是什么呢?


原来,SGA中的各个组件分配都是以granule作为一个单位来分配的,而并不是一次分配1M1K这样的单位。granule大小是以SGA大小由系统设定的,当SGA小于1G时,granule大小为4M,SGA大于1G的时候granule大小为16M。接下来,我们查看一下sga以及granule大小。


由此,我们知道granule大小为16M。但是208granule大小*处理器个数,或者4MB*CPU个数,这几个数字始终联系不到一起。
于是,我又尝试把
db_16k_cache_size设为100M,看看是什么效果。


?


我们设置的110M,查询结果是112M,还是找不出规律,这个问题放到以后再研究一下。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle 11g新特性之只读表 下一篇Oracle 11g维护分区(五)——Mer..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)