block cleanout

本文详细解释了在执行SQL Select操作时,数据库如何在更新或删除数据后生成Redo信息,以及如何通过清除锁信息来减少Redo的生成。通过实例演示了如何利用commit和buffercache来优化Redo生成过程,以及Redo生成的影响和避免策略。

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

没想到在执行select的时候也有可能生产redo 信息。

 

lock存储在block header中。lock的一个副作用是:在下一次access这个block的时候,需要清除lock信息,也就是清除transaction 信息。这个动作会生成redo,并使不是dirty block变成dirty block。也是因为这样,一个简单的select也可能生成redo,并导致在下一个checkpoint发生时,有大量的block需要写入到磁盘上。所幸,这样的事情并不是经常发生的。

之前在http://zzwssfd.iteye.com/blog/1560112 中有说到commit后,系统会revisit那些依然在SGA中,且可以access的blocks。然后清除blocks中的locks。这样使用COMMIT就可以清除那些lock,而不用稍后在SELECT 的时候去清除。

 

我们可以强制的使“清除”动作不发生,来看看这样做的效果如何。有一个commit list是和用户的transaction相关的,oracle会在commit list中记录用户修改过的blocks。每一个commit list是20个blocks长,oracle会维护这些list直到这些blocks的总和(SUM值)超过block buffer cache size的10%后,不再分配新的blocks给commit lists。例如,用户的buffer cache是3000个blocks,oracle最多维护300个blocks的commit list。 在commit时,oracle会对每20个可用的blocks执行一次“清除”动作。只有用户修改的blocks没有超过buffer cache的10%,切那些修改后的blocks依然在buffer cache中,切依然可用,oracle都会执行“清除”。

 

下面用例子来验证"清除“(cleanout)的发生。

1,disable SGA的automatic management 功能

2,设置DB_CACHE_SIZE等于16MB。这样buffer cache可以容纳2048个blocks(每个block是8K)。

3,创建一个一行占用一个block的表。向表中插入10000行数据,commit。这样就有10000个blocks被修改,超     过了buffer cache的10%。因此数据库不足以通过commit来清除所有的blocks的locks信息。事实上,大部分     的数据已经不再buffer cache中了。

4,收集redo生成的信息

5,执行一次SELECT



 这里执行了一个DBMS_STATS,是为了在hard parsing的时候产生副作用。



 下面就是收集redo信息:


上图中执行了两次SELECT。第一次SELECT产生了721652 bytes的redo信息。第二次SELECT 没有产生redo信息。这是因为第一次SELECT的时候,oracle并未对所有修改过的10000个blocks都进行”清除“,只是清除了一部分。因为我们修改了10000个blocks,这超过了oracle可以维护的最大的commit list值。所有在第一次SELECT的时候会有redo生成。第二次SELECT的时候,由于第一次的SELECT 已经完成了”清除“工作,所有没有redo生成。

 

以上来自TOM的《Expert Oracle Database Architecture Oracle Database Programming 9i, 10g, and 11g Techniques and Solutions, Second Edition》

<think>我们正在分析Oracle数据库中数据访问路径的稳定性与物理存储的连续性问题。根据用户之前的查询和我的回答,用户关注的是为什么在没有显式排序的情况下,多次执行相同的ROWNUM分页查询会返回相同顺序的结果。这涉及到Oracle的物理存储结构和数据访问机制。核心要点:1.数据访问路径的稳定性:当执行计划使用全表扫描时,Oracle会按照数据块的物理存储顺序读取数据。2.物理存储连续性:表的数据存储在连续的数据块中,这些数据块按照区(extent)进行分配。我们将结合引用[3]中关于表空间、段、区和块的描述,深入分析物理存储结构如何影响数据访问顺序。回答结构:1.物理存储结构概述:介绍Oracle的存储层次结构(表空间->段->区->块)。2.全表扫描的访问路径:解释全表扫描如何按照区的顺序和块在区内的顺序读取数据。3.影响访问路径稳定性的因素:包括数据修改、统计信息、参数设置等。4.如何验证和监控访问路径:提供相关的SQL查询方法。5.相关问题:生成与物理存储和访问路径相关的问题。注意:引用[1][2][4][5]与当前问题关联性不大,我们主要参考引用[3]关于物理存储结构的描述。开始回答:</think>### Oracle 数据访问路径稳定性与物理存储连续性分析 #### 一、物理存储结构与访问路径基础 Oracle 数据存储采用**层次化结构**,其物理连续性直接影响访问路径稳定性: 1. **存储层次** $$ \text{表空间} \rightarrow \text{段} \rightarrow \text{区} \rightarrow \text{数据块} $$ - 表空间:逻辑存储容器(如引用[3]所述) - 段:表/索引的物理存储单元 - 区:由连续数据块组成(8KB~64KB) - 数据块:最小I/O单元(通常8KB)[^3] 2. **全表扫描路径** ```mermaid graph LR A[扫描首个区] --> B[顺序读取连续数据块] B --> C[跳转至下一区] C --> D{是否达到高水位线?} D -- 是 --> E[结束扫描] D -- 否 --> B ``` 该路径在**数据未修改时保持稳定**,导致多次查询返回相同顺序。 #### 二、影响稳定性的核心因素 1. **物理存储连续性** - 数据插入顺序决定初始物理位置 - 连续区分配保证$O(1)$访问效率 - 验证物理位置: ```sql SELECT ROWID, DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) block_no, DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) file_no FROM user_table; ``` 2. **访问路径锁定机制** | 场景 | 路径稳定性 | 原理 | |------|------------|------| | 无DML操作 | 高 | 数据块位置不变 | | 未更新统计信息 | 高 | 优化器选择相同执行计划 | | 缓冲区缓存命中 | 高 | 复用内存中的物理顺序 | | 并行查询 | 低 | 多进程读取顺序不可控 | 3. **高水位线(HWM)作用** - 标记已使用数据块的上界 - 全表扫描只读取HWM之下的块 - DELETE操作不降低HWM,物理路径不变(如引用[2]备份策略关联) #### 三、稳定性破坏场景分析 1. **数据修改的影响** - INSERT:分配新区 → 扩展HWM → 扫描路径变长 - UPDATE:行迁移 → 数据块位置变更 → 物理顺序断裂 - DELETE:产生碎片 → 后续INSERT填充空隙 → 逻辑顺序与物理顺序解耦 2. **存储参数变更** 当调整以下参数时物理连续性被破坏: ```sql ALTER TABLE user_table MOVE TABLESPACE new_tbs; -- 表空间迁移 ALTER TABLE user_table SHRINK SPACE; -- 空间重组 ``` 3. **索引的隐性影响** 即使未使用索引,其维护操作也会: - 触发块清除(Block Cleanout) - 改变优化器选择全表扫描的概率 - 引起ROWID变化(如分区表索引重建) #### 四、稳定性保障策略 1. **物理顺序固化技术** ```sql /* 按主键顺序重组表 */ CREATE TABLE new_table AS SELECT * FROM old_table ORDER BY pk_col; ALTER TABLE new_table ADD CONSTRAINT pk_primary PRIMARY KEY (pk_col); ``` 2. **访问路径锁定方法** - 固定执行计划: ```sql EXEC DBMS_SPM.load_plans_from_cursor_cache( sql_id => 'g4yuh8aqjk7r9'); ``` - 强制全表扫描: ```sql SELECT /*+ FULL(user_table) */ ... ``` 3. **监控工具** ```sql -- 检查物理读取顺序 SELECT sample_time, sql_id, dbms_rowid.rowid_block_number(rowid) FROM v$active_session_history WHERE sql_id = 'g4yuh8aqjk7r9'; ``` #### 五、企业级实践建议 1. **高可用架构设计**(如引用[1]所述) - RAC环境下使用`service_name`绑定节点 - 设置`cell_offload_processing=false`禁用存储层排序 2. **备份恢复策略**(如引用[2]要求) ```bash # 使用RMAN块级备份保留物理顺序 rman> BACKUP AS COPY DATABASE; ``` 3. **安全审计配置**(如引用[5]建议) - 监控`ALTER TABLE MOVE`等影响物理结构的操作 - 审计`DBMS_REDEFINITION`包调用 > **总结**:Oracle数据访问路径稳定性源于**物理存储的连续性和执行计划一致性**。通过控制DML操作频率、固化执行计划、定期重组表空间(如引用[3]机制),可维持高稳定性访问路径。但需注意这是Oracle的**实现特性而非标准保证**,关键业务仍需显式排序[^3][^5]。 --- ### 相关问题 1. 如何通过`DBMS_ROWID`包解析ROWID获取物理位置信息? 2. Oracle的`_SERIAL_DIRECT_READ`参数如何影响全表扫描路径? 3. 表空间迁移操作会如何改变数据物理连续性? 4. 在RAC环境中如何保证所有节点返回相同的物理读取顺序? 5. 行迁移(Row Migration)对数据访问路径稳定性有何具体影响?[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值