db_keep_cache_size参数的控制范围测试

本文通过实验验证了在Oracle数据库中,即使设置了表的存储类型为Keep,如果没有为Keep缓存分配足够的内存,数据仍然会被存储在Default缓存中。通过调整db_keep_cache_size参数,观察到数据如何从Default缓存迁移到Keep缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ocm考试新题中,需要创建keep存储的表,但在该参数是否应该修改上,有一些分歧,有人说asmm会自动给keep分配内存的,该参数就不用设置了。

看文档和asktom,也是云山雾罩,说什么的都有,还是来实际的测试吧:

SQL> col COMPONENT for a30
SQL> select COMPONENT,CURRENT_SIZE/1024/1024||'MB' MB from V_$SGA_DYNAMIC_COMPONENTS where COMPONENT in ('DEFAULT buffer cache','KEEP buffer cache');

COMPONENT                      MB                                               
------------------------------ ------------------------------------------       
DEFAULT buffer cache           352MB                                            
KEEP buffer cache              0MB                                              

SQL> conn hr/hr
Connected.
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1 as select * from employees;

Table created.

SQL> insert into t1 select * from t1;

107 rows created.

SQL> /

214 rows created.

SQL> /

428 rows created.

SQL> /

856 rows created.

SQL> /

1712 rows created.

SQL> /

3424 rows created.

SQL> /

6848 rows created.

SQL> /

13696 rows created.

SQL> commit;

Commit complete.

SQL> col SEGMENT_NAME for a10
SQL> select SEGMENT_NAME,BYTES/1024/1024||'mb' MB from user_segments where SEGMENT_NAME='T1';

SEGMENT_NA MB                                                                   
---------- ------------------------------------------                           
T1         3mb                                                                  

SQL> alter table t1 storage( buffer_pool keep);

Table altered.

--造了一张3m的keep表
SQL> set autot on
SQL> select count(*) from t1;

  COUNT(*)                                                                      
----------                                                                      
     27392                                                                      


Execution Plan
----------------------------------------------------------                      
Plan hash value: 3724264953                                                     
                                                                                
-------------------------------------------------------------------             
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |             
-------------------------------------------------------------------             
|   0 | SELECT STATEMENT   |      |     1 |    85   (0)| 00:00:02 |             
|   1 |  SORT AGGREGATE    |      |     1 |            |          |             
|   2 |   TABLE ACCESS FULL| T1   | 26589 |    85   (0)| 00:00:02 |             
-------------------------------------------------------------------             
                                                                                
Note                                                                            
-----                                                                           
   - dynamic sampling used for this statement                                   

--做全表扫描,没有物理读,说明是从之前的插入语句读取的数据,并做了240次递归
Statistics
----------------------------------------------------------                      
        240  recursive calls                                                    
          1  db block gets                                                      
        421  consistent gets                                                    
          0  physical reads                                                     
        176  redo size                                                          
        413  bytes sent via SQL*Net to client                                   
        385  bytes received via SQL*Net from client                             
          2  SQL*Net roundtrips to/from client                                  
          4  sorts (memory)                                                     
          0  sorts (disk)                                                       
          1  rows processed                                                     

SQL> select count(*) from t1;

  COUNT(*)                                                                      
----------                                                                      
     27392                                                                      


Execution Plan
----------------------------------------------------------                      
Plan hash value: 3724264953                                                     
                                                                                
-------------------------------------------------------------------             
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |             
-------------------------------------------------------------------             
|   0 | SELECT STATEMENT   |      |     1 |    85   (0)| 00:00:02 |             
|   1 |  SORT AGGREGATE    |      |     1 |            |          |             
|   2 |   TABLE ACCESS FULL| T1   | 26589 |    85   (0)| 00:00:02 |             
-------------------------------------------------------------------             
                                                                                
Note                                                                            
-----                                                                           
   - dynamic sampling used for this statement                                   

--第二次全表扫描已经没有递归了,说明数据已经存入内存,并整齐摆放了
Statistics
----------------------------------------------------------                      
          0  recursive calls                                                    
          0  db block gets                                                      
        310  consistent gets                                                    
          0  physical reads                                                     
          0  redo size                                                          
        413  bytes sent via SQL*Net to client                                   
        385  bytes received via SQL*Net from client                             
          2  SQL*Net roundtrips to/from client                                  
          0  sorts (memory)                                                     
          0  sorts (disk)                                                       
          1  rows processed                                                     

SQL> set autot off
SQL> conn / as sysdba
Connected.
SQL> select COMPONENT,CURRENT_SIZE/1024/1024||'MB' MB from V_$SGA_DYNAMIC_COMPONENTS
  2  where COMPONENT in ('DEFAULT buffer cache','KEEP buffer cache');

COMPONENT                      MB                                               
------------------------------ ------------------------------------------       
DEFAULT buffer cache           352MB                                            
KEEP buffer cache              0MB                                              
--查看内存,整齐摆放的数据并未在keep内存里,说明在default里
SQL> alter system set db_keep_cache_size=12m;

System altered.

SQL> select COMPONENT,CURRENT_SIZE/1024/1024||'MB' MB from V_$SGA_DYNAMIC_COMPONENTS
  2  where COMPONENT in ('DEFAULT buffer cache','KEEP buffer cache');

COMPONENT                      MB                                               
------------------------------ ------------------------------------------       
DEFAULT buffer cache           340MB                                            
KEEP buffer cache              12MB                                             
--开辟keep内存
SQL> conn hr/hr
Connected.
SQL> set autot on
SQL> select count(*) from t1;

  COUNT(*)                                                                      
----------                                                                      
     27392                                                                      


Execution Plan
----------------------------------------------------------                      
Plan hash value: 3724264953                                                     
                                                                                
-------------------------------------------------------------------             
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |             
-------------------------------------------------------------------             
|   0 | SELECT STATEMENT   |      |     1 |    85   (0)| 00:00:02 |             
|   1 |  SORT AGGREGATE    |      |     1 |            |          |             
|   2 |   TABLE ACCESS FULL| T1   | 26589 |    85   (0)| 00:00:02 |             
-------------------------------------------------------------------             
                                                                                
Note                                                                            
-----                                                                           
   - dynamic sampling used for this statement                                   

--重新做全表扫描,优化器虽然已经发现内存default里有数据,但是keep内存开辟了,表又是keep的,但keep里没找到数据
--所以在此强制做了物理读
--说明keep参数为0的时候,表虽然是keep的,但数据还是在default里的,keep的大小并未被asmm自动分配
Statistics
----------------------------------------------------------                      
          0  recursive calls                                                    
          0  db block gets                                                      
        310  consistent gets                                                    
        307  physical reads                                                     
          0  redo size                                                          
        413  bytes sent via SQL*Net to client                                   
        385  bytes received via SQL*Net from client                             
          2  SQL*Net roundtrips to/from client                                  
          0  sorts (memory)                                                     
          0  sorts (disk)                                                       
          1  rows processed                                                     

SQL> select count(*) from t1;

  COUNT(*)                                                                      
----------                                                                      
     27392                                                                      


Execution Plan
----------------------------------------------------------                      
Plan hash value: 3724264953                                                     
                                                                                
-------------------------------------------------------------------             
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |             
-------------------------------------------------------------------             
|   0 | SELECT STATEMENT   |      |     1 |    85   (0)| 00:00:02 |             
|   1 |  SORT AGGREGATE    |      |     1 |            |          |             
|   2 |   TABLE ACCESS FULL| T1   | 26589 |    85   (0)| 00:00:02 |             
-------------------------------------------------------------------             
                                                                                
Note                                                                            
-----                                                                           
   - dynamic sampling used for this statement                                   


Statistics
----------------------------------------------------------                      
          0  recursive calls                                                    
          0  db block gets                                                      
        310  consistent gets                                                    
          0  physical reads                                                     
          0  redo size                                                          
        413  bytes sent via SQL*Net to client                                   
        385  bytes received via SQL*Net from client                             
          2  SQL*Net roundtrips to/from client                                  
          0  sorts (memory)                                                     
          0  sorts (disk)                                                       
          1  rows processed                                                     

SQL> spool off
如果考keep,该参数,还是打开了吧,recycle同理


### 关于 `buffer_compress_percentage` 和 `buffer_compress_chunk` #### 参数定义 `buffer_compress_percentage` 是用于指定压缩目标的一个参数,表示希望达到的压缩比例。它通常是一个百分比值,范围从 0 到 100[^4]。此参数的作用在于优化存储空间利用率的同时保持性能平衡。当设置较高的压缩比例时,虽然可以节省更多的磁盘空间,但也可能增加 CPU 负载以完成更复杂的压缩算法。 另一方面,`buffer_compress_chunk` 定义了单次压缩操作所处理的数据块大小。它的单位通常是字节或者页数,具体取决于系统的实现细节。通过调整这一参数,管理员能够控制每次压缩操作涉及的数据量,从而影响到整体 I/O 性能和资源消耗之间的权衡关系[^5]。 #### 数据库或存储系统中的作用 在数据库环境中,这两个参数共同决定了如何有效地管理缓冲池内的数据压缩行为: - **空间效率提升**: 合理配置上述两个参数可以帮助减少实际写入物理介质上的数据体积,进而降低总体拥有成本(TCO),特别是在大规模部署场景下显得尤为重要。 - **读取性能改善**: 对频繁访问但变化较少的内容启用适当级别的压缩后,在相同容量条件下可容纳更多热数据副本,提高缓存命中率并缩短平均响应时间[^6]。 以下是基于 Oracle 数据库环境下的一个简单示例展示如何应用这些概念来增强工作负载表现: ```sql ALTER SYSTEM SET db_cache_advice='ON'; -- 开启建议功能以便观察当前状况后再做决定 SELECT * FROM v$db_cache_advice; -- 查看现有缓存策略效果评估报告 ALTER TABLESPACE users DATAFILE '/path/to/datafile.dbf' RESIZE 2G; CREATE DISKGROUP dg_compressed NORMAL REDUNDANCY COMPRESS FOR OLTP USING HIGH COMPRESSION ATTRIBUTE SIZE 1M CHECKSUM ON LOGGING BLOCKSIZE 8K ONLINE REBALANCE POWER LIMIT IMMEDIATE NOFORCE INITIALLY EMPTY QUOTA MAXIMUM EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO RETENTION GUARANTEE FLASHBACK ON FORCE LOGGING ENABLE ROW MOVEMENT ALLOW PARALLEL DML ADD FILE '+DATA/dg_compressed/datafile/users.271.938475612' SIZE 2G REUSE AUTOEXTEND OFF NEXT 100M MAXSIZE UNLIMITED KEEP DUPLICATES VALIDATION INTERVAL 1 HOUR MONITORING USAGE TRACKING ALL STATISTICS LEVEL TYPICAL CACHE IN BUFFER_CACHE WITH STANDBY LOGS ARCHIVELOG THREAD 1 GROUP 1 ('/archivelog/arch_1_1.arc') FORMAT '%t_%s_%r.arc'; ALTER SESSION SET "_serial_direct_read"=ALWAYS; -- 强制串行模式下直接路径读取代常规机制以测试不同设定组合的影响差异 INSERT /*+ APPEND */ INTO large_table SELECT * FROM another_large_table WHERE MOD(rownum,10)=0; COMMIT; ``` 以上脚本片段展示了几个方面的工作流程改进措施,其中包括但不限于创建带有高压缩特性的表空间结构设计思路;同时利用会话级指令改变默认执行计划倾向,最终目的是为了验证特定条件下的最佳实践方案可行性分析过程。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值