天天看点

存储结构

OLTP:在线业务处理里系统

(如银行前台,存数据,读数据 跟数据库交互操作)

OLAP:在线数据分析系统

(只能读数据出来,不能写.如数据仓库,

 源数据是在 OLTP上通过ETL抽取出来)

操作系统块 ext3 为4k

oracle 块为系统块的整数倍 默认8k

查看系统块大小

[oracle@sq ~]$ getconf PAGESIZE

4096

查看数据库默认块(8k)

SQL> show parameter block

----------------------------------------------

查询当前用户下所有段

SQL> select * from user_segments

1.SQL> create table t11(id number(5));

2.查看表占用的段

SQL> select * from user_segments t where t.segment_name='T11';

结果: BYTES = 65536 (默认占64k)  (创建一个表占有一个段)

3.

SQL> insert into t11 values(11);

/多次

SQL> insert into t11 select * from t11;

2048 rows created.

4.查看区

SQL> select * from user_extents t where t.segment_name='TA';

结果 :EXTENT_ID =0(为只占用了一个区 0为区号)

5.再次执行

6.重新查看区

结果会有多个区出现 ID从0开始

(如插入数据过多,我们会发现 每个区的BLOCKS数量会从8个 变化到128个

oracle认为数据量太大,每个区变为128个块)

------------------------------------------------

回收

1.

SQL> select count(*) from t11;

  COUNT(*)

----------

   1048576

SQL> delete from t11;

SQL> commit;

2.查看区

select * from user_extents t where t.segment_name='T11';

(发现占用的区并没有少,其实里面都是空的)

3.重新写入数据

1048576 rows created.(跟删除)

4.再次查看区

(发现也没有增加区,说明新数据使用的是之前的空白区)

5.

SQL> set autotrace traceonly(跟踪)

SQL> select * from t11;

27894  consistent gets (27894 次逻辑读)

SQL> delete from t11 where rownum<=1000000;(删除100w条数据)

6.

1679  consistent gets(已经没有多少数据,但还要很多的逻辑读,因为

会扫描表中所有区块,包括空白区)

7.

SQL> alter table t11 move;(移动表,就是清空所有空白区)

8.

 4  consistent gets(逻辑读4 空白区已经没有了)

SQL> select * from user_extents t where t.segment_name='T11';

(发现只剩了一个区)

----------------------------------------------------

小表可以用小块

9i 开始 允许不同的表空使用 不同的块大小

SQL> create tablespace testnblock

  2  datafile '/u01/app/oracle/oradata/orcl/testnblock.dbf' size 10M

  3  blocksize 16k;

create tablespace testnblock

*

ERROR at line 1:

ORA-29339: tablespace block size 16384 does not match configured block sizes

SQL> alter system set db_16k_cache_size = 10M;

System altered.

Tablespace created.

我们可以设置不同的大小  2,4,8,16,32(32位系统不支持32k)

SQL> show parameter db_block_size (默认为8k)

mysql 默认块16k  db2 默认块4k

数据仓库应该 用大点的块

--------------------------

SQL> create table ab as select * from dba_objects;

SQL> analyze table ab compute statistics;(分析表)

SQL> select avg_row_len from user_tables where table_name='AB';

(查看平均行长度,单位字节,一个块 至少能存储一行)

------------------------

查看错误信息

SQL> ! oerr ora 00382

----------------------------

pctfree 块中空闲的空间

方便后续的修改工作 

修改中如原有块空间不够 会建立新块,原有块会建立个指针指向新块,

那么这种操作会读两次i/o.

SQL> alter table t1 pctfree 0;(没有空闲 老的数据不变)

SQL> alter table t1 move pctfree 0;(移动重新排,老数据块也变化)

-------------------------------------

SQL> create table tab_rc

  2  (name01 char(1000),

  3  name02 char(1000),

  4  name03 char(100))

  5  pctfree 0;

SQL> insert into tab_rc(name01,name02) values('c','c');

(插入4次  块中有8000字节数据)

SQL> update tab_rc set name03='c';

(更新4行 多出400字节)

analyze table tab_rc compute statistics;(分析表)

select t.table_name,t.chain_cnt from user_tables t;

(结果 对应链为1)

--------------------------------------------------------------

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from tab_rc;

(第一列为数据文件号,第二列为块号)

oradebug setmypid;

alter system dump datafile 1 block 59626;

SQL> oradebug tracefile_name;

/oracle/app/admin/TEST/udump/test_ora_4772.trc

more /oracle/app/admin/TEST/udump/test_ora_4772.trc

(nrid:  0x0100008c.0      此参数不为0,则代表行迁移)

分析块参数

SQL> create table ab (id int,name varchar2(10));

SQL> insert into ab values(123,'zs');

SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from ab;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

------------------------------------ ------------------------------------

                                   1                                59610

SQL> oradebug setmypid;

SQL> alter system dump datafile 1 block 59610;

/oracle/app/admin/TEST/udump/test_ora_9426.trc

[oracle@oracle111 ~]$ more /oracle/app/admin/TEST/udump/test_ora_9426.trc

1.块头部

flg:0x01 (新建块)0x2(数据块延迟清洗推进scn和seq) 0X04(设置校验和) 0x08(临时块)

type:0x06(表/索引块)

frmt:  0x01(v7)  0x02(v8)

2.ITL (事务槽)

seg/obj :(object_id 十六进制表示)

csc: 0x00.15a3ea --cleanoutSCN,块清除时的SCN

itc: 2   --ITL槽的数量

flg: E   --指用的是ASSM,如果是O表示用的是free list

typ: 1 - DATA   --事务型的数据块(并且:数据块头的type:0x06),存放表和索引数据。

3.用户数据头

bdba: 0x01800087  -- 数据块的地址

tsiz: 0x1f98  --top of size 块的总大小即8088个字节

hsiz: 0x14   --Data header size 数据头大小即20个字节

ntab=1     --叫表数:表示这个块的数据在一个表(如果是聚簇表就有可能是2或2以上)

nrow=1     --叫行数:表示这个表有一行数据

fsbo=0x14   -- Free space begin offset  叫起始空间:可以存放数据空间的起始位置(即定义了数据层中空闲空间的起始offset)

fseo=0x1f8c  -- Free space end offset  叫结束空间:可以存放数据空间的结束位置(即定义了数据层中空闲空间的结束offset)

avsp=0x1f78  --Available space for new entries  叫空闲空间:定义了数据层中空闲空间的字节数

tosp=0x1f78  --Total space   叫最终空闲空间:定义了ITL中事务提交后,数据层中空闲空间的字节数

0xe:pti[0]      nrow=1  offs=0  --Table directory,整个表的开始,共一行数据 ,定义了该表在行索引中使用的插槽数

0x12:pri[0]     offs=0x1f8c      --Row index,叫行索引,定义了该块中包含的所有行数据的位置

4.用户数据

tab 0, row 0, @0x1f8c      --第一个表第一行的位置 ,定义了该表在行索引中的起始插槽号

tl: 12 fb: --H-FL-- lb: 0x1  cc: 2  --行头,tl: 12行长度12个字节,

fb: (Flag byte)--H-FL指H(Head piece of row)F(First data piece) L(Last data piece)

lb: 0x1 --Lock byte和上面的ITL的lck相对应,表示这行是否被lock了

cc: 2 --表示有两列,即这个表有两个字段

上一篇: ceph 简介