存储结构

简介:

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.再次执行

SQL> insert into t11 select * from t11;

/多次


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.重新写入数据

SQL> insert into t11 values(11);

/多次

SQL> insert into t11 select * from t11;

/多次

1048576 rows created.(跟删除)


4.再次查看区

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

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


5.

SQL> set autotrace traceonly(跟踪)

SQL> select * from t11;

27894  consistent gets (27894 次逻辑读)


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

SQL> commit;


6.

SQL> select * from t11;

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

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


7.

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


8.

SQL> select * from t11;

 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.


SQL> create tablespace testnblock

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

  3  blocksize 16k;


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> commit;

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;



SQL> oradebug tracefile_name;

/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 --表示有两列,即这个表有两个字段

col  0: [ 2]  c1 02 --第一行的第一个字段长度和值

col  1: [ 5]  41 41 41 41 41 --第一行的第二个字段长度和值






     本文转自陈继松 51CTO博客,原文链接:http://blog.51cto.com/chenjisong/1737383,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 算法 NoSQL
什么是数组存储结构
什么是数组存储结构
100 8
|
7月前
|
存储
B树——磁盘链式存储数据结构
B树——磁盘链式存储数据结构
|
存储
二叉树的存储结构
二叉树的存储结构
117 0
|
存储 算法 C语言
【数据结构】树的基础知识及三种存储结构
文章目录 一、树的概念与定义 二、树的有关名词 三、树的存储结构 1.双亲表示法 2.孩子表示法 3.孩子兄弟表示法(又叫二叉树法) 四、树的应用
|
存储 程序员
二叉树的概念及存储结构
二叉树的概念及存储结构
78 0
|
6月前
|
存储 算法 数据处理
逻辑结构与存储结构的区别
**逻辑结构**是指数据对象中数据元素之间的逻辑关系,它描述了数据的组织方式。这种结构不涉及数据在内存中的具体存储方式,而是更多关注数据元素之间的逻辑关系,如线性关系、树形关系、图形关系等。 **存储结构**也称为物理结构,是指数据的实际存储在计算机内存中的组织方式。它关心如何将数据存放在计算机的内存或其他存储设备中,以便有效地访问和修改。存储结构通常包括顺序存储结构、链式存储结构等。
112 0
|
7月前
|
存储
数据结构的树存储结构(上)
数据结构的树存储结构
93 0
|
7月前
|
存储 C语言
数据结构的树存储结构(下)
数据结构的树存储结构
92 0
|
7月前
|
存储 vr&ar
数据结构的图存储结构
数据结构的图存储结构
73 0
|
7月前
|
消息中间件 存储 NoSQL
LevelDb跳表实现
LevelDb跳表实现
58 0