keep buffer pool的实验及使用

本文通过实验探讨了如何正确使用Oracle的Keep Pool特性来确保表数据始终保留在内存中。包括设置参数、创建表、插入数据及维护统计信息等步骤,并讨论了影响表驻留内存的因素。

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

--下面是对keep pool使用的实验及总结:

alter system set db_keep_cache_size=100m scope=both;
create table test(c1 int,c2 char(2000),c3 char(2000),c4 char(2000),c5 char(1000)) storage(buffer_pool keep)cache;
insert into test values(1,'a','b','c','d');
insert into test select * from test;    --重复多次
analyze table test compute statistics for table for all columns;
或exec dbms_stats.gather_table_stats(user,'X1',cascade=>true);
select distinct c2,c3,c4,c5 from test;


注:
1.要想使对象真的保持在内存中,一定要让db_keep_cache_size的值大于系统中所有buffer_pool为keep的所有对象的空间之和,而且还要略大于这个空间之和,至于大多少,我不是很确定,本人只是片面的进行了简单的测试,一个194M的表,需要大约240m的空间,一个66M的表,需要85M的空间,具体情况,还需要具体测试;
2.表进行dml操作后,一定要先进行analyze或dbms_stats.gather_table_stats(),也就是生成最新的统计信息,如果差别很大,那么也不能保证表在内存中;
3.在我的实验里,一旦表被强行刷出内存或者因keep pool不足而被挤出内存或者数据库重新启动,即使db_keep_cache_size空间足够大,其他数据库对象属性的修改、分析及数据库的重启,都不能让该对象重新回到内存,必须对该表进行再次分析,才能使该表重新回到内存;
4.刚才看到资料,忽然想起了keep buffer中对象的undo信息也是存储在keep pool中的,因此,第一点中keep buffer要比需要keep在keep pool中的对象所需空间之和稍大的原因,从这里找到了答案;

转载于:https://www.cnblogs.com/lhdz_bj/archive/2011/03/15/1984645.html

<think>我们正在解析DM数据库(达梦数据库)中STORAGE子句的参数含义。根据引用[1]中的提示,STORAGE子句控制表的存储参数,包括INITIAL(初始区大小)、NEXT(下一个区大小)、MINEXTENTS(最小区数)、MAXEXTENTS(最大区数)等。 在DM数据库中,STORAGE子句用于指定表或索引的存储特性,这些参数直接影响数据段的物理存储分配和扩展行为。下面详细解析每个参数: 1. **INITIAL**: - 含义:指定对象(表或索引)创建时分配的初始区(extent)的大小。 - 单位:默认为KB,也可以指定为MB(如`INITIAL 50M`)。 - 作用:当表或索引被创建时,会立即分配一个大小为INITIAL的初始区。如果初始区被填满,则会按照NEXT参数分配下一个区。 - 示例:`INITIAL 65536` 表示初始区大小为65536KB(即64MB)。 2. **NEXT**: - 含义:指定当初始区被填满后,下一次扩展时分配的区的大小。 - 单位:同INITIAL,默认为KB。 - 作用:当表或索引需要更多空间时,系统会分配一个大小为NEXT的新区。每次扩展都会分配一个NEXT大小的区,直到达到MAXEXTENTS限制。 - 示例:`NEXT 1048576` 表示下一次扩展将分配1048576KB(即1024MB或1GB)。 3. **MINEXTENTS**: - 含义:指定对象创建时初始分配的区的个数。 - 注意:在DM数据库中,通常初始分配就是INITIAL指定的一个区,所以MINEXTENTS一般设置为1。 - 示例:`MINEXTENTS 1` 表示初始分配1个区。 4. **MAXEXTENTS**: - 含义:指定对象可以扩展的最大区数。 - 作用:限制对象的总区数,防止无限制扩展。当达到最大区数时,如果空间不足,会报错。 - 示例:`MAXEXTENTS 2147483645` 表示最大可以扩展到2147483645个区(这是一个非常大的数字,几乎相当于无限制)。 5. **PCTINCREASE**: - 含义:指定每次扩展时区大小的增长百分比(在DM数据库中,该参数通常设置为0,表示每次扩展都按NEXT大小分配,不递增)。 - 示例:`PCTINCREASE 0` 表示每次扩展的区大小都是相同的(即NEXT值)。 6. **FREELISTS** 和 **FREELIST GROUPS**: - 含义:用于管理空闲空间列表。FREELISTS指定空闲列表的数量,FREELIST GROUPS指定空闲列表组的数量。在并发插入较多的场景中,适当增加这些值可以减少竞争。 - 示例:`FREELISTS 1 FREELIST GROUPS 1` 表示使用1个空闲列表组和1个空闲列表。 7. **BUFFER_POOL**: - 含义:指定对象使用的缓冲池(如KEEP、RECYCLE或默认DEFAULT)。 - 作用:可以将频繁访问的表或索引放入KEEP缓冲池,以减少I/O。 8. **FLASH_CACHE** 和 **CELL_FLASH_CACHE**: - 含义:与闪存缓存相关的设置(在DM数据库中可能不常用,通常使用默认值)。 在用户提供的示例中,STORAGE子句配置如下: ```sql STORAGE( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) ``` 解释: - 初始区大小为64MB(65536KB)。 - 每次扩展分配1024MB(1048576KB)。 - 初始分配1个区。 - 最大区数为2147483645(几乎无限制)。 - 扩展区大小不递增(PCTINCREASE=0)。 - 使用默认的空闲列表和缓冲池设置。 **注意事项**: - 这些存储参数在创建表或索引时指定,一旦创建,修改起来可能比较复杂(通常需要重建对象)。 - 对于不同的表空间,如果表空间本身已经指定了默认存储参数,那么创建对象时可以不指定STORAGE子句,将使用表空间的默认参数。 **配置建议**: - 对于小表,可以设置较小的INITIAL和NEXT。 - 对于大表或增长很快的表,可以设置较大的NEXT以减少扩展次数。 - 在高并发插入场景,适当增加FREELISTS和FREELIST GROUPS。 [^1]: 引用[1]提到STORAGE子句控制表的存储参数,包括INITIAL、NEXT、MINEXTENTS、MAXEXTENTS等。 相关问题: 1. 在DM数据库中,如何查看一个表或索引的当前存储参数(如INITIAL、NEXT等)? 2. 修改已有表或索引的存储参数有哪些方法?需要注意什么? 3. 表空间中的默认存储参数如何设置?创建对象时STORAGE子句与表空间默认参数的关系是什么? 4. DM数据库中,STORAGE参数设置不当可能导致哪些性能问题? 5. 如何估算一个表所需的初始存储空间(INITIAL)和扩展大小(NEXT)?</think>### DM数据库 STORAGE 参数详解 在 DM(达梦)数据库中,`STORAGE` 子句用于控制数据库对象的物理存储特性。以下是关键参数的解析: #### 1. **INITIAL** - **含义**:初始区(extent)的大小 - **作用**:对象创建时分配的初始存储空间 - **示例**:`INITIAL 65536` 表示初始分配 64MB 空间(65536KB) - **最佳实践**:根据表预期数据量设置,避免频繁扩展[^1] #### 2. **NEXT** - **含义**:扩展区的大小 - **作用**:当初始空间不足时,每次扩展的增量大小 - **示例**:`NEXT 1048576` 表示每次扩展分配 1GB 空间 - **最佳实践**:对于增长快的表设置较大值,减少扩展次数 #### 3. **MINEXTENTS** - **含义**:最小扩展次数 - **作用**:对象创建时必须分配的最小区数量 - **示例**:`MINEXTENTS 1` 表示至少分配1个初始区 - **注意**:通常与 INITIAL 配合使用 #### 4. **MAXEXTENTS** - **含义**:最大扩展次数 - **作用**:限制对象可扩展的最大区数量 - **示例**:`MAXEXTENTS 2147483645` 表示几乎无限制扩展 - **风险控制**:防止失控增长导致存储溢出 #### 5. **PCTINCREASE** - **含义**:扩展区增长率 - **作用**:每次扩展时 NEXT 大小的增长百分比 - **示例**:`PCTINCREASE 0` 表示每次扩展大小固定 - **最佳实践**:通常设为0避免指数级增长 #### 6. **FREELISTS** - **含义**:空闲列表数量 - **作用**:管理可插入数据的空闲块 - **示例**:`FREELISTS 1` 适用于低并发场景 - **高并发优化**:增加该值可减少块竞争 #### 存储参数关系图 ``` 初始分配 → INITIAL │ ├─空间不足 │ ├─扩展大小 → NEXT │ ├─扩展次数限制 → MAXEXTENTS │ └─增长率 → PCTINCREASE │ └─空闲管理 → FREELISTS ``` #### 配置示例 ```sql CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50) ) STORAGE ( INITIAL 100M, -- 初始100MB NEXT 50M, -- 每次扩展50MB MINEXTENTS 1, -- 最小1个区 MAXEXTENTS 1000, -- 最大1000次扩展 PCTINCREASE 0, -- 固定扩展大小 FREELISTS 5 -- 高并发优化 ); ``` ### 性能影响分析 1. **空间利用率**:`INITIAL` 过小会导致频繁扩展,过大则浪费空间 2. **并发性能**:`FREELISTS` 不足会导致插入操作竞争 3. **扩展效率**:`PCTINCREASE > 0` 可能导致后期扩展过大而低效 4. **存储限制**:`MAXEXTENTS` 设置不当可能导致表无法继续写入 [^1]: 引用[1]提到STORAGE子句控制表的存储参数,包括初始区大小和扩展行为 --- ### 相关问题 1. 如何监控DM数据库中表的空间使用情况和扩展历史? 2. 在什么场景下需要调整FREELISTS参数?如何确定最佳值? 3. DM数据库中MAXEXTENTS设置过小会导致什么具体错误?如何解决? 4. 表空间存储参数与对象级STORAGE参数优先级关系是什么? 5. 如何估算大表的合理INITIAL和NEXT值?有哪些计算依据?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值