按资料说V$BH查看表来显示数据库里每个对象类型的数据缓冲区里数据块的数量.
然后查询V$bh
select
owner, object_name
from
dba_objects o,
v$bh bh
where
o.object_id = bh.objd
and
o.owner =MOBILEADC
这一查找出 MOBILEADC 用户创建的对象 数据块的相关信息
也可以查询表的数据快的信息
select
owner, object_name
from
dba_objects o,
v$bh bh
where
o.object_id = bh.objd
and
o.object_name =’NN_APPLICATION’;
v$BH中有个状态
The possible values of X$BH.STATUS are:
0, FREE, no valid block image
1, XCUR, a current mode block, exclusive to this instance
2, SCUR, a current mode block, shared with other instances
3, CR, a consistent read (stale) block image
4, READ, buffer is reserved for a block being read from disk
5, MREC, a block in media recovery mode
6, IREC, a block in instance (crash) recovery mode
可以查询表空间的快大小
select tablespace_name,block_size from dba_tablespaces;
在安装数据库的时候我们将db_block_size这个default block size设置成了8k,那么在安装以后Oracle是不允许我们修改默认块大小的。对于一个8196字节大小的数据块一般block overhead会占据其中100个左右的字节,那么剩下的8096字节的空间就用来存储我们的行数据库,如果我们插入1个字节的行数据,那么这个块是否会允许我们插入8096行呢?答案当然是否定的。其实排除pctfree和mssm情况下的pctused等段级存储参数,一行的的开销最小也要11个字节左右,因此我们可以算一下8k大小的数据库其实最多可以存储8096/11=736行的数据。
现在用实验来说明一下:
SQL> drop table hellotab purge;
表已删除。
SQL> create table hellotab
2 (name varchar2(1)) pctfree 0;
---这里我们创建了一个只有一列,并且pctfree为0的表段,这也表示着,理论上我们这个段可以最大限度的插入数据。
表已创建。
SQL> show user;
USER 为 "SYS"
SQL> desc dba_tablespaces;
名称 是否为空? 类型
----------------------------------------- -------- ------------------------
TABLESPACE_NAME NOT NULL VARCHAR2(30)
BLOCK_SIZE NOT NULL NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NOT NULL NUMBER
MAX_EXTENTS NUMBER
PCT_INCREASE NUMBER
MIN_EXTLEN NUMBER
STATUS VARCHAR2(9)
CONTENTS VARCHAR2(9)
LOGGING VARCHAR2(9)
FORCE_LOGGING VARCHAR2(3)
EXTENT_MANAGEMENT VARCHAR2(10)
ALLOCATION_TYPE VARCHAR2(9)
PLUGGED_IN VARCHAR2(3)
SEGMENT_SPACE_MANAGEMENT VARCHAR2(6)
DEF_TAB_COMPRESSION VARCHAR2(8)
RETENTION VARCHAR2(11)
BIGFILE VARCHAR2(3)
SQL> select tablespace_name,block_size from dba_tablespaces;
TABLESPACE_NAME BLOCK_SIZE
------------------------------ ----------
SYSTEM 8192
UNDOTBS1 8192
SYSAUX 8192
TEMP 8192
USERS 8192
EXAMPLE 8192
TEST 8192
UNDO_SMALL 8192
RBTEST 8192
MYALAN 2048
可以看到我们的system表空间的大小是标准的8192个字节
我们再来看看这个段理论上的最大行数
SQL> select object_name,object_id from dba_objects where object_name='HELLOTAB';
OBJECT_NAME OBJECT_ID
-------------------------------------------------------------------------------------------------------------------------------- ----------
HELLOTAB 56661
SQL> col object_name for a30
SQL> /
OBJECT_NAME OBJECT_ID
------------------------------ ----------
HELLOTAB 56661
SQL>select spare1 from tab$ where obj#=56661;
SPARE1
----------
736
确实是736行。
这个时候我们再查询一下,指定的表段中数据块中的最大达到行数。
因为我们的hellotab表是空的,所以下面的查询应该返回NULL:
SQL> selectmax(sys_op_rpb(rowid))from hellotab;
MAX(SYS_OP_RPB(ROWID))
----------------------
现在向hellotab中插入5000条记录
SQL> begin
2 for i in 1 .. 5000
3 loop
4 insert into hellotab values('A');
5 end loop
6 ;
7 commit;
8 end;
9 /
PL/SQL 过程已成功完成。
SQL> select max(sys_op_rpb(rowid)) from hellotab;
MAX(SYS_OP_RPB(ROWID))
----------------------
733
可以看到块中最大的行数是733行。
进一步通过rowid转换来确定:
SQL> select file_number,block_id,count(*) row_numbers
2 from
3 (
4 select dbms_rowid.rowid_relative_fno(rowid) file_number,
5 dbms_rowid.rowid_block_number(rowid) block_id
6 from hellotab
7 )
8 group by file_number,block_id;
FILE_NUMBER BLOCK_ID ROW_NUMBERS
----------- ---------- -----------
1 62628 734
1 62632 596
1 62629 734
1 62630 734
1 62631 734
1 62626 734
1 62627 734
已选择7行。