网站首页 > 技术文章 正文
一、ORACLE表空间管理
1、本地表空间管理tablespace(LMT)
LMT是通过把EXTENT MANAGEMENT LOCAL子句添加到tablespace的定义句法而实现的。和原来由字典管理的tablespace(DMT)不同,LMT会将扩展管理自动化,并保持Oracle DBA不会被用来指定管理扩展大小的NEXT存储参数。这个原则唯一的例外是在NEXT和MINEXTENTS一起用在表格创建的时候。
2、自动区段空间管理(ASSM)
ASSM的tablespace是通过将SEGMENT SPACE MANAGEMENT AUTO子句添加到tablespace的定义句法里而实现的。通过使用位图freelist取代传统单向的链接列表freelist,ASSM的tablespace会将freelist的管理自动化,并取消为独立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存储参数的能力。
现在ORACLE基本都是ASSM表空间管理,下面我们讨论ASMM表空间管理。
二、自动区段空间管理
1、ASSM结构
ASSM整体结构是由三层位图快和数据块组成。第一层位图块L3块,一块L3块存放多个L2块地址,一个L2块地址存放多个L1块地址,结构示意图如下:
ORACLE一般通过以下几步将数据插入数据库中块的:
第一步:查找数据字典(DBA_SEGMENTS)定位段头(L3)的位置
第二步:在段头中找到L2的位置
第三步:在L2块中根据进程PID号,做HASH运算得到一个随机数A,然后根据随机数找到对应A的L1块地址信息
第四步:根据对应的L1块信息,再次根据进程PID号,做HASH运算得到一个随机数B,然后根据B找到对应数据库块M地址信息
第五步:向第M块插入数据
以上步骤中L3块一般只有一个,一个L3块中有多个L2块一般只有当一个L2用完才会选择第二个L2块,此处不是随机选择,在L2中选择L1时通过HASH算法就是随机选择了,在L1中选择数据块也是通过HASH算法,所以此处也是随机选择,如果一个L2块中有50个L1块地址信息,一个L1中有50数据块地址信息,那么久可以支持同时2500个进程PID同时插入,这就是ORALCE数据所说的支持高并发的原理。
2、ASSM案例
我们建立一个表空间管理方式为ASSM的表空间为50M区大小为1M
CREATE TABLESPACE LIUXIAOBIN0724 DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN0724_01.DBF' SIZE 50M REUSE UNIFORM SIZE 1M;
CREATE TABLE LUXIAOBIN0724(ID INT,NAME VARCHAR2(20)) TABLESPACE LIUXIAOBIN0724;
查看区占用情况
SELECT EXTENT_ID, --区ID
FILE_ID, --文件ID
BLOCK_ID, --第一个块ID
BLOCKS --块数
FROM DBA_EXTENTS
WHERE SEGMENT_NAME = 'LUXIAOBIN0724' --表名
ORDER BY EXTENT_ID
我们分别DUMP块128,129,130,131看看块类型(L1,L2,L3)
ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN0724_01.DBF' block 128;
ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN0724_01.DBF' block 129;
ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN0724_01.DBF' block 130;
ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN0724_01.DBF' block 131;
根据DUMP文件可知128和129号块为L1
根据DUMP文件可知130号块为L2块131块为段头块L3
此时向表中插入数据:
INSERT INTO LUXIAOBIN0724 VALUES(1,'BBBBBB');
COMMIT;
SELECT * FROM LUXIAOBIN0724;
查看数据插入的那个块
SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) FILEID, --文件ID
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK_ID,--块id
DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) ROW_ID,--行ID
ID
FROM LUXIAOBIN0724;
换一个会话插入一行数据;
INSERT INTO LUXIAOBIN0724 VALUES(2,'CCCCCC');
COMMIT;
查看不同会话插入的块情况:
再次用第一个会话插入一条数据并查看插入的块情况;
根据实验我们知道,同一个会话插入的是同一个块,不同会话插入的是不同的,所以ASSM在在同一个会话大量插入数据时可能导致BUFFER BUSY WAITS,
大家可以思考我们搞数据库的常常会遇到一个问题:比如一个应用刚上班的时候,系统经常出现BUFFER BUSY WAITS,到下午了系统使用的人更多了反而不会出现BUFFER BUSY WAITS.这个问题在上面的实验大家深入实验可以找到答案。
我先做结论,大家有兴趣的可以继续深入实验:ASSM的L1中数据块的多少是根据表大小来定的,表越大,L1中数据块越多,越多的话随机插入不同数据块的可能性越大,反之同时插入一个块的可能性就越大,就容易出现BUFFER BUSY WAITS,普通插入数据的时候是在高水位现之下,找空闲数据块插入,高水位线位于L1块最后一个块位置,L1中HASH算法只在高水位线之下找空闲块,所以要高并发,需要提高高水位线,和L1中数据块数。
猜你喜欢
- 2024-11-02 oracle——把表移到另一个表空间 oracle把一个表的数据导入另一个表
- 2024-11-02 生产环境Oracle undo表空间管理的最佳实践
- 2024-11-02 记一个很奇怪的现象:Oracle数据库undotbs1表空间莫名丢失?
- 2024-11-02 一文看懂oracle数据库UNDO表空间是如何设计的
- 2024-11-02 ORACLE RAC数据库Ora-01653表空间不足故障解决
- 2024-11-02 Oracle表空间扩容 oracle表空间扩容 最大为32
- 2024-11-02 Oracle数据库怎样增加表空间 oracle如何增加表空间大小
你 发表评论:
欢迎- 627℃几个Oracle空值处理函数 oracle处理null值的函数
- 621℃Oracle分析函数之Lag和Lead()使用
- 610℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 604℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 601℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 593℃【数据统计分析】详解Oracle分组函数之CUBE
- 584℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 567℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- oracle 19cOCM认证有哪些内容(oracle认证ocm月薪)
- Oracle新出AI课程认证,转型要持续学习
- oracle 表的查询join顺序,可能会影响查询效率
- Oracle DatabaseAmazon Web Services正式可用,Oracle数据库上云更容易了
- Oracle 19.28 RU 升级最佳实践指南
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 如何主导设计一个亿级高并发系统架构-数据存储架构(三)
- Java 后端开发必看!工厂设计模式轻松拿捏
- ORA-00600 「25027」 「x」报错(抱错孩子电视剧 爸爸是武术 另一个爸爸是画家)
- 新项目终于用上了jdk24(jdk新建项目)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)