存储结构

OLTP:在线业务处理里系统

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

OLAP:在线数据分析系统

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

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

操作系统块 ext3 为4k

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

查看系统块大小

[[email protected] ~]$ 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

[[email protected] ~]$ 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 --第一行的第二个字段长度和值

时间: 2024-10-24 22:07:17

存储结构的相关文章

SQL SERVER大话存储结构(5)

阅读目录(Content) 1 基本介绍 2 对数据库启动的影响 3 日志文件添加方式 4 物理结构 5 延迟日志截断原因 6 管理事务日志 本系列上一篇博文链接:SQL SERVER大话存储结构(4)_复合索引与包含索引 回到顶部(go to top) 1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行日志备份. 大容量日志模式,适用于批量操作的

二叉树的链式存储结构----二叉链表

头文件:head.h #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof()

SQLServer2012 表IAM存储结构探究

SQLServer2012 表IAM存储结构探究 Author:zfive5(zidong) Email: [email protected] 引子 国庆节期间,一直在翻阅<程序员的自我修养-链接.装载与库>,这本给我的感觉是越看越乱,但总的来说还不错,一句话--优秀程序员就应该知道每一个字节的意义. 看此书前的两本<深入解析SQLServer2008>和<Microsoft SQL Server 2005技术内幕:存储引擎>对IAM解读都是点到为止,让我满脑袋是一堆问

SQL SERVER大话存储结构(2)

阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3.3 聚集索引表(非唯一)的非聚集索引 4 非聚集索引如何查找页 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 本系列上一篇博文链接:SQL SERVER大话存储结构(1)_数据页类型及页面指令分析 回到顶部(go t

SQL SERVER大话存储结构(3)

阅读目录(Content) 1 引入 2 数据行 2.1 数据行结构 2.2 特殊情况(大对象.行溢出及forword) 2.2.1 大对象 2.2.2 行溢出 2.2.3 forword 3 测试存储情况 3.1 堆表分析 3.2 添加主键 3.3 增加一列:可空变长列 3.4 增加一列:非空变长列+默认值 3.4.1 非大对象列 3.5 删除无数据的列 3.6 删除有数据的列 3.7 行溢出 3.8 Forword 4 行结构与DDL 一行数据是如何来存储的呢? 变长列与定长列,NULL与N

InnoDB引擎的索引和存储结构

InnoDB引擎的索引和存储结构 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的.而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎. 1.MySQL主要存储引擎的区别 MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB,另外还有MERGE.MEMORY(HEAP)等. (1)主要的几个存储引擎 MyISAM管理非事务表,提供高速存储和检索,以及全文搜

线性表的链式存储结构

1 n个结点链结成一个链表,即为线性表的链式存储结构,由于每一个结点只包含一个指针域,因此称为单链表. 链表中第一个结点的存储位置成为头指针,那么整个链表的存取就必须是从头指针开始了. 有时候会在单链表的第一个结点前附设一个结点,称为头结点. 头指针与头结点的区别: 头指针: (1)头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针. (2)头指针具有标识作用,所以常用头指针冠以链表的名字. (3)无论链表是否为空,头指针都不为空.头指针是链表的必要元素. 头结点: (1)

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

几种常见的线性表存储结构

1.线性表的的动态分配顺序存储结构 1 #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 2 #define LISTINCREMENT 100 //线性表存储空间的分配增量 3 typedef struct { 4 ElemType *elem; //存储空间基址 5 int length; //当前长度 6 int size; //当前分配的存储容量 7 }SqList; //动态分配 + 顺序存储结构 2.线性表的单链表存储结构 1 typedef st