oracle block other,oracle中block

本文详细探讨了Oracle数据库中数据块的使用,包括如何通过V$BH视图查询数据块数量,以及通过V$BH和DBA_OBJECTS查询特定用户或表的数据块信息。还解释了数据库块头开销,以及8K块能存储的最大行数。通过实验展示了插入数据后,数据块中最大行数的计算和验证。
摘要由CSDN通过智能技术生成

按资料说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行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值