oracle中block

来源:互联网 发布:阿里云企业邮箱 免费 编辑:程序博客网 时间:2024/05/17 01:17

按资料说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行呢?答案当然是否定的。其实排除pctfreemssm情况下的pctused等段级存储参数,一行的的开销最小也要11个字节左右,因此我们可以算一下8k大小的数据库其实最多可以存储8096/11=736行的数据。

现在用实验来说明一下:
SQL> drop table hellotab purge;

表已删除。

SQL> create table hellotab
  2  (name varchar2(1)) pctfree 0;
---
这里我们创建了一个只有一列,并且pctfree0的表段,这也表示着,理论上我们这个段可以最大限度的插入数据。

表已创建。

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> select
max(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行。