- 浏览: 76347 次
- 性别:
- 来自: 广州
文章分类
最新评论
1.创建一个测试表,test,并且插入10000行数据;
2.创建一个存储过程SHOW_SPACE:
3.检查表test的空间使用情况:
SQL> exec show_space('TEST');
Total Blocks............................24
Total Bytes.............................196608
Unused Blocks...........................3
Unused Bytes............................24576
Last Used Ext FileId....................1
Last Used Ext BlockId...................58745
Last Used Block.........................5
由上可知,该表test共占用了24个数据块,196608字节,文件ID为1
4.获得表test在数据块中的分布情况:
由此可见,表test中的数据共占用了16个数据块,但是前面第三步中,发现该表占用了24个数据块。这是正常的,因为oracle本身会使用8个数据库来记录段头、位图块等额外的信息。我们现在只需要了解到,表test共占用了24个数据块,其中16个是数据,8个是表信息。
5.检查x$bh和v$bh的更新:
这里可以看到,在v$bh和x$bh中得到的数据块,是从58729~58749的21条记录,但是在第四步中,我们知道数据是占用了58730~58745的16个数据库,这里,58729数据块里面存放的是段头信息,可以通过如下命令进行验证:
在v$bh视图中,我们可以看到这21个数据块都是xcur状态,表示这些数据块都是排斥状态,正在被使用,该字段还有其他的类型,
oracle的缓冲块的管理机制一直没有正式的发布过,因此许多有经验的oracle工程师都是通过经验或者一下oracle文档中的注释来推断oracle的缓冲块的管理机制的。
事实上,oralce使用v$bh视图来记录与数据缓冲(data buffer)相关的信息,它详细记录了数据缓冲中每一个数据块(data block)的状态信息。
在v$bh视图中的status字段,记录了数据块的状态,在非OPS、非RAC这样的集群环境中,数据块的状态会是下列几种之一:xcur,cr,read,free,用户可以通过如下命令得到数据库的状态信息:
SQL> select unique status from v$bh;
其状态的意义分别是:
xcur:(exclusive current)的意思,表示该数据块处于排外模式;
cr:表示该数据块是一个克隆(clone)的数据库,可以执行共享的只读操作;
free:表示这是一个限制的数据块,oracle现在没有使用它;
read:表示该数据块正在从磁盘读取数据;
write:表示数据库正在往磁盘写入数据;
在数据库恢复过程中,该字段还有另外两个描述:mrec和irec:
mrec:(media recovery)表示数据块处于介质恢复模式;
irec:(instance recovery)表示数据块处于实例恢复模式;
在RAC环境中,数据块还有另外一种模式:
scur (shared current),表示该数据库正在和其他实例共享数据。
6.清空数据缓存:
7.重新检查v$bh和x$bh的内容:
这时候我们可以看到,x$bh中的tch字段,已经由原来的3变成了0,同时v$bh视图的数据块状态也变成了free,但是记录的数据块并没有发生变化,还是在58729~58749这些数据块中,这就是说,虽然数据已经被写到了磁盘中,但是数据库记录的指针并没有清空,仅仅是其状态发生了改变。
8.进阶
明白是oracle数据库管理数据块的部分工作模式后,我们可以利用v$bh文件统计对象在数据缓冲中被cache的块数了,如:
表示表test中有17个数据块还存在于缓存当中。
begin for i in 1 .. 10000 loop execute immediate 'insert into test values(:x)' using i; end loop; end;
2.创建一个存储过程SHOW_SPACE:
create or replace procedure show_space(p_segname in varchar2, p_owner in varchar2 default user, p_type in varchar2 default 'TABLE', p_partition in varchar2 default NULL) as l_total_blocks number; l_total_bytes number; l_unused_blocks number; l_unused_bytes number; l_LastUsedExtFileId number; l_LastUsedExtBlockId number; l_last_used_block number; procedure p(p_label in varchar2, p_num in number) is begin dbms_output.put_line(rpad(p_label, 40, '.') || p_num); end; begin dbms_space.unused_space(segment_owner => p_owner, segment_name => p_segname, segment_type => p_type, partition_name => p_partition, total_blocks => l_total_blocks, total_bytes => l_total_bytes, unused_blocks => l_unused_blocks, unused_bytes => l_unused_bytes, last_used_extent_file_id => l_LastUsedExtFileId, last_used_extent_block_id => l_LastUsedExtBlockId, last_used_block => l_last_used_block); p('Total Blocks', l_total_blocks); p('Total Bytes', l_total_bytes); p('Unused Blocks', l_unused_blocks); p('Unused Bytes', l_unused_bytes); p('Last Used Ext FileId', l_LastUsedExtFileId); p('Last Used Ext BlockId', l_LastUsedExtBlockId); p('Last Used Block', l_last_used_block); end;
3.检查表test的空间使用情况:
引用
SQL> exec show_space('TEST');
Total Blocks............................24
Total Bytes.............................196608
Unused Blocks...........................3
Unused Bytes............................24576
Last Used Ext FileId....................1
Last Used Ext BlockId...................58745
Last Used Block.........................5
由上可知,该表test共占用了24个数据块,196608字节,文件ID为1
4.获得表test在数据块中的分布情况:
select f, b from (select dbms_rowid.rowid_relative_fno(rowid) f, dbms_rowid.rowid_block_number(rowid) b from test) group by f, b order by b;
由此可见,表test中的数据共占用了16个数据块,但是前面第三步中,发现该表占用了24个数据块。这是正常的,因为oracle本身会使用8个数据库来记录段头、位图块等额外的信息。我们现在只需要了解到,表test共占用了24个数据块,其中16个是数据,8个是表信息。
5.检查x$bh和v$bh的更新:
select file#, dbablk, tch from x$bh where obj = (select data_object_id from dba_objects where owner = 'SYS' and object_name = 'TEST') order by dbablk;
select file#, block#, status from v$bh where objd = (select data_object_id from dba_objects where owner = 'SYS' and object_name = 'TEST') order by block#;
这里可以看到,在v$bh和x$bh中得到的数据块,是从58729~58749的21条记录,但是在第四步中,我们知道数据是占用了58730~58745的16个数据库,这里,58729数据块里面存放的是段头信息,可以通过如下命令进行验证:
select header_file, header_block from dba_segments where owner = 'SYS' and segment_name = 'TEST';
在v$bh视图中,我们可以看到这21个数据块都是xcur状态,表示这些数据块都是排斥状态,正在被使用,该字段还有其他的类型,
引用
oracle的缓冲块的管理机制一直没有正式的发布过,因此许多有经验的oracle工程师都是通过经验或者一下oracle文档中的注释来推断oracle的缓冲块的管理机制的。
事实上,oralce使用v$bh视图来记录与数据缓冲(data buffer)相关的信息,它详细记录了数据缓冲中每一个数据块(data block)的状态信息。
在v$bh视图中的status字段,记录了数据块的状态,在非OPS、非RAC这样的集群环境中,数据块的状态会是下列几种之一:xcur,cr,read,free,用户可以通过如下命令得到数据库的状态信息:
SQL> select unique status from v$bh;
其状态的意义分别是:
xcur:(exclusive current)的意思,表示该数据块处于排外模式;
cr:表示该数据块是一个克隆(clone)的数据库,可以执行共享的只读操作;
free:表示这是一个限制的数据块,oracle现在没有使用它;
read:表示该数据块正在从磁盘读取数据;
write:表示数据库正在往磁盘写入数据;
在数据库恢复过程中,该字段还有另外两个描述:mrec和irec:
mrec:(media recovery)表示数据块处于介质恢复模式;
irec:(instance recovery)表示数据块处于实例恢复模式;
在RAC环境中,数据块还有另外一种模式:
scur (shared current),表示该数据库正在和其他实例共享数据。
6.清空数据缓存:
alter system flush buffer_cache;
7.重新检查v$bh和x$bh的内容:
select file#, dbablk, tch from x$bh where obj = (select data_object_id from dba_objects where owner = 'SYS' and object_name = 'TEST') order by dbablk;
select file#, block#, status from v$bh where objd = (select data_object_id from dba_objects where owner = 'SYS' and object_name = 'TEST') order by block#;
这时候我们可以看到,x$bh中的tch字段,已经由原来的3变成了0,同时v$bh视图的数据块状态也变成了free,但是记录的数据块并没有发生变化,还是在58729~58749这些数据块中,这就是说,虽然数据已经被写到了磁盘中,但是数据库记录的指针并没有清空,仅仅是其状态发生了改变。
8.进阶
明白是oracle数据库管理数据块的部分工作模式后,我们可以利用v$bh文件统计对象在数据缓冲中被cache的块数了,如:
select count(*) from v$bh where objd = (select data_object_id from dba_objects where owner = 'SYS' and object_name = 'TEST') and status != 'free';
引用
COUNT(*)
----------
17
----------
17
表示表test中有17个数据块还存在于缓存当中。
发表评论
-
Oracle高水位线(HWM)及性能优化
2010-12-29 00:06 1654转[url]http://blog.csdn.net/wang ... -
oracle段的查看和管理
2010-12-27 17:43 0转http://www.dnbcw.com/biancheng ... -
ORACLE块的分析
2010-12-27 13:16 898(一) 一直以来对“块”的概念总是含混不清,从字面意义理解,只 ... -
Oracle数据块原理深入剖析
2010-12-27 10:06 669转http://www.bitscn.com/pdb/orac ... -
Oracle 10g大文件表空间
2010-12-24 11:15 904简单介绍 Oracle 10g 的存储能力有了显著的增强。这表 ... -
表空间的分类
2010-12-24 10:41 1160表空间可以按4种方式分类 一、按数据文件的类型,分为: 大 ... -
Oracle配置文件详解listener.ora、sqlnet.ora、tnames.ora
2010-12-23 17:16 1925三个配置文件 listener.ora、sqlnet.ora ... -
rowid
2010-08-02 12:04 1004在oracle,rowid是一个很重要的概念。 简单来说row ...
相关推荐
在Oracle数据库中,V$视图是由数据字典视图和pga_aggregate_target初始化参数共同维护的,它们提供了对系统当前状态的快照。 V$视图主要分为几大类别: 1. **执行计划分析**:如V$SQL、V$SQLAREA和V$SQLTEXT,这些...
X$BH视图是Oracle数据库中的一个内部数据结构,它是一个动态性能视图的源表,主要用于监视和分析数据库缓冲区的状态。在Oracle 9i版本中,X$BH视图就已经被用来深入理解数据库缓冲区的结构。通过查询X$BH视图,DBA...
在Oracle 8i之前,新加载到缓冲区的数据块会自动放置到最近使用列表的前端,但自8i版本起,策略发生了变化,新数据缓冲区被插入到缓冲区链的中部,这是一个优化的策略,旨在提高数据缓冲的效率。 数据缓冲区的内部...
为了监控数据缓冲区的性能,Oracle提供了一个内部视图X$BH,包含数据块的使用时间和计数。通过查询X$BH,我们可以找到那些被频繁访问的“热数据块”,并将它们转移到KEEP缓冲池,以确保它们始终在内存中可用。 ...
2. **数据库状态 (B)**: 通过查询 `v$database` 视图来确认数据库实例的状态,例如是否正常运行。 3. **当前非 SYS/SYSTEM 用户会话 (C)**: 查询 `v$session` 视图以识别活跃用户会话,特别是那些非管理员用户。此...
* 查看段在 Buffer Cache 中的占用情况,利用 V$BH 视图。 常见问题 * 大表的全扫描会降低 Buffer Cache 的命中率。 * 等待事件会影响 Buffer Cache 的性能情况。 总结 Buffer Cache 是 Oracle 中的一种缓存机制...
为了提高效率,我们可以使用`V$BH`动态性能视图,它提供了当前在缓冲区高速缓存(Buffer Cache)中的块信息。`V$BH`视图包含的`FILE#`和`BLOCK#`字段正好对应我们的file_id和block_id,如下所示: ```sql SELECT ...
- **使用`x$bh`视图**:`x$bh`提供了关于缓冲区高速缓存的信息,可以帮助理解哪些表的数据最频繁地被访问,从而决定哪些表应优先加载到内存中。 - **`ALTER TABLE`的`CACHE`参数**:通过设置`CACHE`或`NOCACHE`选项...
【标题】"bh.rar_jsp 初学_jsp 系统_学生管理 java_学生管理系统_管理系统" 提供了一个关于初学者使用 JSP(JavaServer Pages)开发学生管理系统的项目。这个标题暗示了该压缩包可能包含一个简单的 Java Web 应用...
7. **Spring框架**:由于Java标签,很可能项目使用了Spring框架,这是一个广泛使用的Java企业级应用开发框架,提供了依赖注入、AOP(面向切面编程)和MVC(模型-视图-控制器)等特性,便于构建和管理API服务。...