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、付费专栏及课程。

余额充值