oracle中block
按资料说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行。
                    
                
                
            
        
浙公网安备 33010602011771号