(一)
一直以来对“块”的概念总是含混不清,从字面意义理解,只知道这是ORACLE存放数据的最小单位,然而它的内部世界如何呢,本人打算从今天开始连载几篇文档,对它进行深度分析。
通过很多文档、资料,了解到了数据库基本结构鱼刺图:
基本上每个对象对应一个段( Segment),只有分区对应多个段,这里的对象包括table,index,partition等等,段可以跨越多个数据文件。
每个段又有多个区(extent)来组成,这些区不能跨越多个数据文件,同时在系统使用过程中自动扩展。
最后是块(block),所有的数据都是存放在块中。为了适应操作系统,每个块在创建数据库的时候默认了一个大小,这个大小一般是8K,同时在9I及其以 后的版本中增加了不同大小的块参数,这将在以后的实验中体现。先说说这个8K大小的块,一般来说,为了使得oracle运行读写数据文件的时候有一个合理 的吞吐量,这里的块大小,都跟操作系统块大小设为整数倍,例如ntfs格式化的磁盘文件,每个物理块大小为4,这里oracle的块大小为8,即是代表每 读取一个oracle块,其实物理上也就是读取了两个操作系统块。 这里主要指的是数据文件存放在块设备上,在实际的生产环境中,大部分情况都是将数据库安装在裸设备(RAW)也叫做原始分区之上。关于RAW将在以后进行 讲解。
通过上面这段文字,我们可以了解到ORACLE基本的存储结构,下一篇将针对块的大小与存放数据大小来做实验。
(二)
上一节了解到了ORACLE的存储结构,这节讲一讲块的大小与数据存放之间的关系。
大家都知道了在ORACLE环境中,所有的对象都是存放在块中,这个块大小与存放的记录之间到底存在怎样的关系呢?
做一个实验看看:
1.创建一个表空间test
create tablespace test datafile 'F:\oracle\product\10.1.0\oradata\liweiwei\test.dbf' size 100M;
2.创建一个用户并授权,连接
create user test identified by test default tablespace test;
grant connect,resource to test;
connect test/test@liweiwei
3.创建一个表
create table test.t1(a1 number,a2 number);
4.检查段,可以发现在这个视图中出现了名称为T的段,段类型为TABLE,这个段里面分配了1个区,其中包含8个块,大小为64K字节。
select segment_name, blocks, extents, bytes, segment_type, tablespace_name
from dba_segments
where owner = 'TEST';
5.检查区,可以发现在这个视图中出现了一个区,区号为0,包含8个块,大小为64K字节。
select segment_name,segment_type,extent_id,blocks,bytes from dba_extents where owner='TEST';
6.查询t1表所属的Object id,检查块,可以发现这里没有载入到内存的块,由此断定,在数据未写入的时候,内存中并没有存放数据的块。
select obj# from obj$ where name='T1';
select file#,block#,class#,status,xnc,objd from v$bh where objd=49685
没有数据。
7.插入10行数据,进行测试。
declare
i number;
begin
for i in 1 .. 10 loop
execute immediate 'insert into test.t1 values(:x,:y)'
using i, i;
end loop;
end;
8.再次查看v$bh视图,检查内存中是否使用到了块。
select file#,block#,class#,status,xnc,objd from v$bh where objd=49685
果然出现了数据,说明在数据插入的表的时候在内存中已经载入了分配的块,同时在这些块中写入了数据,这里占用了两个块,块号分别为58729,58730,其中我们可以根据CLASS#来判断出他们属于不同类型.
(三)
这一节紧接着上一节来说。
上一节通过实验,我们了解到,块的创建和读取流程,不过只是针对一个会话的,现在我们来看看在一个会话中插入数据之后,同时在另外一个会话查询数据,这样的情况会对块有什么影响。
打开一个新的会话, 然后执行如下命令:
查询表,由于插入数据的事务没有提交,这里在另外的会话中就看不到任何数据,深深体现了ORACLE的多版本一致性
select * from t1;
未选定行
查询视图v$bh,看是否有了变化
select file#,block#,class#,status,xnc,objd from v$bh where objd=49685;
果然和上一节查询出来的结果不同,多了红色字体标识出来的两行,大家可以看到这两行的STATUS字段值为cr,什么是cr呢?它是Consistency Read(一致性读取)的缩写。从这里可以看出58730这个块被两个会话进行了操作。
在第一个会话中回滚事务会发生什么呢?看下面的操作:
会话1:执行rollback
SQL> rollback;
回退已完成。
再次查询v$bh视图,看看什么情况
select file#,block#,class#,status,xnc,objd from v$bh where objd=49684;
结果还是一样,说明在事务回滚之后,块还是处于一致读取的状态。
(四)
我们继续上一节的话题。
关闭数据库实例
引用
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145488364 bytes
Database Buffers 25165824 bytes
Redo Buffers 524288 bytes
数据库装载完毕。
数据库已经打开。
检查v$bh视图
select file#,block#,class#,status,xnc,objd from v$bh where objd=11038;
未选定行
说明在没有进行块中数据的相关操作的时候,并没有从物理文件中提取块到内存。
执行查询或者插入、更新的SQL语句
引用
SQL> insert into test.t values (200,200);
已创建 1 行。
再次检查v$bh视图
SQL> select file#,block#,class#,status,xnc,objd from v$bh where objd=49685;
总结:在没有进行物理I/O的时候,v$bh视图中不会出现相关的块信息,同时证明此视图中存放的乃是数据文件块放到内存中的“块”信息。
- 大小: 3.4 KB
- 大小: 3.1 KB
- 大小: 1.8 KB
- 大小: 4.5 KB
- 大小: 6.7 KB
- 大小: 6.7 KB
- 大小: 4.6 KB
分享到:
相关推荐
### Oracle块分析 #### 一、Oracle存储结构基础 Oracle数据库的存储结构是层次式的,主要包括以下几个层次: 1. **对象(Object)**:数据库中的基本逻辑单元,如表(Table)、索引(Index)、分区(Partition)...
在Oracle数据库的管理中,了解和分析数据块结构,能够帮助DBA进行更加精确的故障诊断与性能调优。通过分析数据块的头部信息,可以检查数据的完整性,监控事务日志的使用情况,以及对损坏数据块进行修复。因此,对...
### Oracle 数据块原理分析 #### 一、Oracle 数据块概述 Oracle 数据库是业界领先的数据库管理系统之一,其高效的数据管理机制使得它能够在多种环境中提供稳定且高性能的服务。Oracle 数据库中,最基本的数据管理...
"Oracle数据块结构分析说明" Oracle 数据块结构是 Oracle 数据库存储数据的基本单元。一个数据块(Block)是 Oracle 数据库中的最小存储单元,它是数据文件(Datafile)中的一部分。每个数据块的大小可以是 2k、4k...
### Oracle数据库性能分析 #### 一、Oracle体系结构 Oracle数据库是一个复杂且功能强大的关系型数据库管理系统(RDBMS),其核心组件包括实例和数据库文件。理解Oracle的体系结构对于优化性能至关重要。 - **实例**...
Oracle 数据块深入分析总结 Oracle 数据块是 Oracle 数据库中最基本的存储单元,每个数据块都包含了数据、索引、事务控制信息等内容。在本文中,我们将对 Oracle 数据块的内部结构进行深入分析,并且使用 dump 和 ...
本文将深入探讨Oracle内存结构,包括SGA(System Global Area)和PGA(Program Global Area),以及如何进行全面的内存分析。 一、Oracle内存架构 1. SGA(系统全局区) SGA是Oracle数据库运行时共享的一片内存...
### Oracle坏块处理详解 #### 引言 在Oracle数据库管理中,遇到ORA-01578错误,即“Oracle数据块损坏”,是DBA(数据库管理员)们经常面临的一项挑战。这种错误通常伴随着ORA-01110错误,指向特定的数据文件及其...
本文将深入探讨Oracle块碎片的监控方法、清理策略以及如何通过这些方法提升数据库性能。 一、Oracle块碎片的产生 1. 表空间碎片:当表中的行被删除或更新时,其占用的空间可能不会立即被回收,导致空闲空间散落在...
### Oracle逻辑读写深入分析 在Oracle数据库管理与优化领域,深入理解逻辑读写机制对于提升数据库性能至关重要。本文将围绕“Oracle逻辑读写深入分析”这一主题,结合描述及部分示例内容,全面解析Oracle数据库中...
这一步骤是基于CBO(Cost-Based Optimizer,成本基础优化器)进行的,优化器会分析SQL语句并生成最佳执行路径。 接下来,Oracle执行一系列的检查,包括语句的语法合法性,确认SQL格式正确;语义检查,验证涉及的表...
Oracle AWR(Automatic Workload Repository)性能分析详解 AWR是Oracle数据库中的一个自动负载信息库,它通过收集数据库的统计信息,帮助DBA们分析并诊断数据库的性能问题。自从Oracle 10g版本起,AWR就成为了性能...
这份名为"Oracle 内存全面分析"的PDF文档深入探讨了Oracle内存架构的各个方面,对于DBA(数据库管理员)和开发人员来说,理解这些知识至关重要。 Oracle内存主要由两大部分构成:System Global Area (SGA) 和 ...
Oracle 索引分析与查询优化 Oracle 是一种关系型数据库,广泛应用于国内交通、电力、通信和金融等重要领域。 Oracle 在处理数据效率和数据安全上有非常大的提高,磁盘阵列技术(RAID)和集群技术(RAC)的运用也...
- **Block changes**:每秒发生的块更改数量为179.2,结合redo大小分析,可以推断出系统并没有经历大量的DML操作。 - **Physical reads/writes**:物理读和写非常低,这可能意味着缓存命中率较高。 - **Parses/Hard ...
本主题聚焦于"Oracle.10g性能分析与优化思路",旨在深入探讨如何通过一系列技术手段和策略让Oracle数据库运行得更加流畅、快速。 一、SQL优化 1. SQL执行计划分析:了解SQL语句的执行过程,利用 Explain Plan 工具...
### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...
Oracle的Explain Plan和AWR(Automatic Workload Repository)报告是常用的性能分析工具。 8. **安全性**:Oracle数据库提供了丰富的安全特性,如用户权限管理、角色、审计、网络加密等,确保数据安全。 9. **高...