oracle表段区块的简述,oracle中的段区块的说明

段:segment

一个段建立以后,oracle会给它分配一个区,这个区一般是8个块(空块)。

em建立表空间:

创建表空间要考虑的事项有:

1:数据文件个数

2:段的管理方式

自动:表空间中的对象将自动管理其空闲空间,这将提高空闲空间管理性能(毫无疑问选择自动管理)

手动:表空间中的对象将使用空闲列表来管理其空闲空间,这是为了确保向后兼容

3:区的管理方式

本地管理(毫无疑问选择本地管理)

选择本地管理后,区的分配方式可以设置为(自动,统一)一般选择自动

字典管理

4:表空间的状态(读写,只读,脱机)

5:表空间的类型(永久,temp,undo)

6:是否启动事件日志(redolog),一般选择启动。

访问:localhsot:1158/em

0818b9ca8b590ca3270a3433284dd417.png

登录后进入(管理)->(表空间)-(创建)

0818b9ca8b590ca3270a3433284dd417.png

创建表空间需要给表空间指定数据文件,在右下角点击(添加)添加数据文件:

0818b9ca8b590ca3270a3433284dd417.png

点击确定后:

0818b9ca8b590ca3270a3433284dd417.png

通过em设置后,生成的sql语句为:

CREATE SMALLFILE TABLESPACE "DATA1"

DATAFILE '/u01/app/oracle/oradata/jiagulun/data1_01.dbf' SIZE 100M REUSE

AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED

LOGGING

EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO

意思为创建表空间名称为:data1

数据文件为:/u01/app/oracle/oradata/jiagulun/data1_01.dbf,数据文件大小为100m,重用数据文件

表空间自动扩展(AUTOEXTEND ON) ,每次扩展大小100M (NEXT 100M) ,最大扩展,不限制(UNLIMITED)

启动redolog(LOGGING)

区管理方式为本地(EXTENT MANAGEMENT LOCAL)

段管理方式为 自动(SEGMENT SPACE MANAGEMENT AUTO)

查询一个段的信息:v$segments;user_tables

select segment_name,blocks,extents,bytes,segment_type,tablespace_name from dba_segments where segment_name = 'T2';

0818b9ca8b590ca3270a3433284dd417.png

segment_name:段的名称

blocks:有384个块

extents:有18个区

bytes:段大小

segment_type:段类型

tablespace_name:段对应的表空间

blocks和extents和bytes,3个字段的值不是实时的反应段的使用情况的。需要统计分析后才会准确一些。

对表进行分析,使blocks和extents和bytes准确:

analyze table t2 compute statistics

或者

exec dbms_stats.gather_table_stats('SYS','T2')

查看表的使用情况:

select table_name,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len from user_tables where table_name = 'T2'

0818b9ca8b590ca3270a3433284dd417.png

table_name 表名

num_rows:表有多少行

blocks:表中数据所占的数据块数

empty_blocks:表中的空块数

avg_space:数据块中平均的使用空间(平均每个块908字节)

chain_cnt:表中行连接和行迁移的数量

avg_row_len:每条将记录的平均长度

查看区相关的信息:v$extents

select * from dba_extents where segment_name = 'T2';

0818b9ca8b590ca3270a3433284dd417.png

extent_id:是区的编号,上面查询说明了该段分配了0~17编号的区,共18个区

file_id:区所在的文件,上面查询说明了这些区都在1号文件上(dba_data_files)

block_id:起始块id ,上面的查询中0号区的起始块id是61433

blocks:总共块数,上面的查询中0号区的分配了8个块,因为oracle发现分的区太多,oracle会认为你这个段的数据会比较大,所以在第16个区的时候以下就分配了128个块,(这就是区的自动管理,如果是统一管理,那么一直都会是8个块)

高水位线的问题:

段使用分给他的区的最后一个块的位置,高水位线是oracle对表进行全表扫描的一个位置,(假如段分配了有10万个块,但是实际使用了2000个块,那么高水位线在2000个块的位置,那么如果你访问这个表的时候,oracle只访问2000个块,如果在10个块的位置,那么oracle访问表的时候会访问10万个块。)

通过delete对一个表删除,表的高水位线没有下来(假如有1w个块,当前如果高水位在1000,delete表后,高水位线还会在1000个块的位置)

需要对表进行空间整理

delete from t2;

commit;

analyze table t2 compute statistics;

select table_name,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len from user_tables where table_name = 'T2'

0818b9ca8b590ca3270a3433284dd417.png

查询发现,数据是0行,但是还是占用265个块,那么oracle访问表的时候,会访问265个块。

set autotrace on;

select count(*) from t2;//查看执行计划

0818b9ca8b590ca3270a3433284dd417.png

通过查询可以看到还是发生了269个读,也就是高水位没有释放

truncate table t2;

commit;

analyze table t2 compute statistics;

select table_name,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len from user_tables where table_name = 'T2'

0818b9ca8b590ca3270a3433284dd417.png

查询看出,blocks已经清空,高水位降了

set autotrace on;

select count(*) from t2;//查看执行计划

0818b9ca8b590ca3270a3433284dd417.png

发现读几乎没有了

oracle块的物理结构:

oracle块默认是8k

块头:块的物理地址,块属于哪个表空间,事务槽,行目录。

0818b9ca8b590ca3270a3433284dd417.png

如图:块头从上往下用

数据行从下往上用

行的结构:

行的头部记录行的锁信息,第一列的长度,第一列值,第二列的长度,第二列的列值。。。所有的行都是连在一起的,首尾相连,没个行的长度都是不一样的

oracle读数据块的方式:

在块的头部有行目录,行目录里面将记录了每一行的起始位置。当oracle要找某一行的时候,会在行目录里面找到对应行的起始位置,然后到那个位置去,然后找对应的列,比如要找第三列,那么会先找到第一列的长度,然后跳过第一列的列值,接着找到第二列的长度,再跳过第二列值,就找到了第三列;如果把经常访问的列放在行头部,会有些许的优化,但是效果很小。

查询oracle默认数据块的大小:

show parameter block

0818b9ca8b590ca3270a3433284dd417.png

可以看到 db_block_size 是8k

查看操作系统的块大小:

dumpe2fs /dev/sda1

0818b9ca8b590ca3270a3433284dd417.png

block size是4k

也就是说2个操作系统的块是一个oracle的数据块

行连接和行迁移:pct_free

行连接:如果一行的数据太大了超过8k(block默认是8k),那么oracle会用多个块存储1行数据,第一个块指向第二个块,这就是行连接

行迁移:pct_free是一个块剩余空间,当oracle更新数据时原来更新后的数据长度过大,并达到块的pct_free时,这时这个行就不能放到这个块了,那么会启用新的块来放置更新的行,旧块里面的行不会指向新块里面的行。

查看一张表的行连接和行迁移状态:

select table_name,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len from user_tables where table_name = 'T2'

0818b9ca8b590ca3270a3433284dd417.png

chain_cnt就是行连接和行迁移的数量,当avg_row_len大于块的大小时(8k或者查看参数),那么就是行连接,反之则是行迁移,

可以把表导出来再导进去,进行表整理.也可以对这张表建立16k或者32k的表空间.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值