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 --第一行的第二个字段长度和值