新闻详情

新闻详情

首页 / 资讯中心 / 详情

Oracle数据库基础之3_存储结构

发布时间:2026/10/1 16:14:47来源:尧图网络
Oracle数据库基础之3_存储结构
存储逻辑结构数据库由许多TABLESPACE表空间组成每个TABLESPACE表空间包含一个或多个segment段一个segment段包含一个或多个extent区一个extent区包含8个block块数据库由许多TABLESPACE表空间组成SQLselectTABLESPACE_NAMEfromdba_tablespaces;TABLESPACE_NAME------------------------------SYSTEM SYSAUX UNDOTBS1TEMPUSERS EXAMPLE...每个TABLESPACE表空间包含一个或多个segment段SQLselectSEGMENT_NAME,TABLESPACE_NAMEfromdba_segmentswhereTABLESPACE_NAMEUSERS;SEGMENT_NAME TABLESPACE_NAME---------------------------------------- ------------------------------DEPT USERS EMP USERS PK_DEPT USERS PK_EMP USERS SALGRADE USERS ACTION_TABLE USERS....一个segment段包含一个或多个extent一个extent包含8个blockSQLcreatetablehr.object2asselect*fromdba_objects;Tablecreated.SQLcol SEGMENT_NAME format a20SQLselectSEGMENT_NAME,EXTENT_ID,BLOCK_IDfromdba_extentswhereSEGMENT_NAMEOBJECT2;SEGMENT_NAME EXTENT_ID BLOCK_ID---------------------------------------- ---------- ----------OBJECT20520OBJECT21528OBJECT22536OBJECT23544OBJECT24552…存储物理结构每个表空间包含一个或多个数据文件SQLaltertablespaceusersadddatafile/u01/app/oracle/oradata/ocp/users02.dbfsize10M;SQLaltertablespaceusersadddatafile/u01/app/oracle/oradata/ocp/users03.dbfsize10M;SQLcol FILE_NAME format a60SQLselectFILE_NAME,TABLESPACE_NAMEfromdba_data_filesorderby2desc;FILE_NAME TABLESPACE_NAME-------------------------------------------------------------------------------- ------------------------------/u01/app/oracle/oradata/ocp/users01.dbf USERS/u01/app/oracle/oradata/ocp/users02.dbf USERS/u01/app/oracle/oradata/ocp/users03.dbf USERS/u01/app/oracle/oradata/ocp/undotbs01.dbf UNDOTBS1/u01/app/oracle/oradata/ocp/system01.dbf SYSTEM/u01/app/oracle/oradata/ocp/sysaux01.dbf SYSAUX/u01/app/oracle/oradata/ocp/example01.dbf EXAMPLE7rowsselected.存储逻辑结构关联存储物理结构是通过ORACLE数据库块和OS操作系统块来匹配一个DB的block是8KB一个OS的block是4KB一个DB的block包含一个或多个OS的blocksqlSQLshowparameter db_block_size NAMETYPEVALUE------------------------------------ ----------- ------------------------------db_block_sizeinteger8192[rootDB1~]# blockdev --getbsz /dev/sdb4096[rootDB1~]# stat -f -c %s /dev/sdb4096表空间的管理方式 表空间的本地管理方式在表空间内通过位图管理区在本地管理的表空间中每个数据文件内都维护一个位图以了解该数据文件内块的空闲或使用状态。位图中的每个位对应于一个块或一组块。其特点是分配了的某个区或释放的某个区可被重新使用时Oracle 服务器更改位图值以显示块的新状态。因为表空间的存储管理信息保存在表空间的数据文件的头部而不是保存在表空间外部的数据字典中所以被称为“本地管理方式”。 表空间的字典管理方式由数据字典管理区数据字典的信息存储在system表空间中Oracle 服务器将在分配或回收区时更新数据字典中对应的表。字典管理的表空间内的段可具有自定义的存储设置,因此每个段都可以有不同的存储子句但是需要手动合并空闲区。这比本地管理的表空间更灵活但效率要低得多。这种方式已经废弃 段的管理方式 目前都是采用auto管理方式了,表中的clob和blob字段内容是以独立的LOB segment来存储的而基表(Base Table)中只包含一个定位器或者指针指向对应的 LOB 数据所在的位置 简介段的manual管理方式以PCTFREE20且PCTUSED40为例进行介绍 当向块中插入行时块的空闲空间在减少直到块内的空闲空间等于或者小于20%此时行所占用的块内可用数据空间达到80%(100–PCTFREE) 或者更多后此后则无法在该块内插入数据。剩余的20% 可在行大小增长时使用。例如更新初始为NULL 的列并分配一个值。这样更新后的块使用率可能超过80%。如果由于更新删除了块内的行或者行大小减少块使用率可能跌至80% 以下。但是仍然无法向块中插入直到块使用率跌至PCTUSED在本例中为40% 以下则该块可用于重新插入。就像喝酒给客人杯子里倒酒倒满80%就不倒了等客人喝到杯子里的酒到了杯子容量40%后又可以给客人倒酒了。 select * from dba_segments查询出来多少行就是多少个段表名和索引名就是段名普遍表和普遍索引只有一个段分区表和分区索引有多少个子分区就有多少个段 sql SQL col segment_name format a20 SQL col PARTITION_NAME format a20 SQL select table_name from dba_tables where table_nameupper(TIMES); TABLE_NAME ------------------------------ TIMES SQL select segment_name,PARTITION_NAME,SEGMENT_TYPE from dba_segments where segment_nameupper(TIMES); SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE -------------------- -------------------- ------------------ TIMES TABLE SQL select table_name from dba_tables where table_nameupper(SALES); TABLE_NAME ------------------------------ SALES SQL select segment_name,PARTITION_NAME,SEGMENT_TYPE from dba_segments where segment_nameupper(SALES); SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE -------------------- -------------------- ------------------ SALES SALES_Q4_2001 TABLE PARTITION SALES SALES_Q4_2000 TABLE PARTITION SALES SALES_Q4_1999 TABLE PARTITION SALES SALES_Q4_1998 TABLE PARTITION SALES SALES_Q3_2001 TABLE PARTITION ...表空间的管理方式是local即本地管理对立的就是字典管理,参考dba_tablespaces.EXTENT_MANAGEMENT;段的管理方式是auto对立的就是manual参考dba_tablespaces.SEGMENT_SPACE_MANAGEMENT区的分配方式autoallocate对立的就是uniform参考dba_tablespaces.ALLOCATION_TYPE。区是表空间中最小的空间分配单位对表空间的管理是以区为单位进行的。AUTOEXTEND自动扩展不是指表空间的自动扩展指的是表空间中的数据文件的自动扩展。SQLcreatetablespacetest datafile/u01/app/oracle/oradata/ocp/test01.dbfsize10M;SQLselectTABLESPACE_NAME,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT,ALLOCATION_TYPE,NEXT_EXTENTfromdba_tablespaceswhereTABLESPACE_NAMETEST;TABLESPACE_NAME EXTENT_MAN SEGMEN ALLOCATIO NEXT_EXTENT------------------------------ ---------- ------ --------- -----TESTLOCALAUTO SYSTEMSQLcol FILE_NAME format a50SQLselectFILE_NAME,AUTOEXTENSIBLEfromdba_data_fileswhereTABLESPACE_NAMETEST;FILE_NAME AUT-------------------------------------------------- ---/u01/app/oracle/oradata/ocp/test01.dbfNOSQLdroptablespacetest including contentsanddatafiles;SQLcreatetablespacetest datafile/u01/app/oracle/oradata/ocp/test01.dbfsize10M autoextendonnext10M extent managementlocaluniform size1M segment space management manual;SQLselectTABLESPACE_NAME,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT,ALLOCATION_TYPE,NEXT_EXTENTfromdba_tablespaceswhereTABLESPACE_NAMETEST;TABLESPACE_NAME EXTENT_MAN SEGMEN ALLOCATIO NEXT_EXTENT------------------------------ ---------- ------ --------- -----------TESTLOCALMANUAL UNIFORM1048576SQLcol FILE_NAME format a50SQLselectFILE_NAME,AUTOEXTENSIBLEfromdba_data_fileswhereTABLESPACE_NAMETEST;FILE_NAME AUT-------------------------------------------------- ---/u01/app/oracle/oradata/ocp/test01.dbf YES数据文件往小里改的条件不能小于已经使用的空间此空间表示此数据文件的所有表的高水位对应的空间。SQLcreatetablespacete123 datafile/u01/app/oracle/oradata/ocp/te123size30M;SQLcreatetabletable123tablespacete123asselect*fromdba_objects;SQLinsertintotable123select*fromtable123;SQLcommit;SQLalterdatabasedatafile/u01/app/oracle/oradata/ocp/te123resize20M;SQLalterdatabasedatafile/u01/app/oracle/oradata/ocp/te123resize15M;alterdatabasedatafile/u01/app/oracle/oradata/ocp/te123resize15M*ERROR at line1: ORA-03297:filecontainsuseddatabeyond requested RESIZEvalueTruncate table后表对应的数据文件size不可以往小里改Delete table后为什么表对应的数据文件size不可以往小里改?因为delete后高水位线仍然存在所以还需要对表进行shrink space cascade模式收缩才能降低高水位SQLcreatetablespacete123 datafile/u01/app/oracle/oradata/ocp/te123size30M;SQLcreatetabletable123tablespacete123asselect*fromdba_objects;SQLinsertintotable123select*fromtable123;SQLcommit;SQLdeletefromtable123;150474rowsdeleted.SQLcommit;Commitcomplete.SQLalterdatabasedatafile/u01/app/oracle/oradata/ocp/te123resize15M;alterdatabasedatafile/u01/app/oracle/oradata/ocp/te123resize15M*ERROR at line1: ORA-03297:filecontainsuseddatabeyond requested RESIZEvalueSQLaltertabletable123enableROWMOVEMENT;Tablealtered.SQLaltertabletable123 shrink spacecascade;Tablealtered.SQLalterdatabasedatafile/u01/app/oracle/oradata/ocp/te123resize15M;Databasealtered.现实环境中为什么要降低高水位线我们知道数据库的最小逻辑单位的数据块sql查询表的时候把数据文件从磁盘中读取到内存SGA中时读取的是数据块再从这些数据块中找到需要的表的行从数据文件读取到SGA中的DB buffer时是要从表对应的第一个块到最后一个高水位线的块。如果表执行过很多delete动作那就会有很多空块或没有写满的块没有降低高水位线的话这些空块或没有写满的块的也要读取到SGA中的DB buffer这样不仅消耗内存而且消耗CPU从越多的数据块中找到需要的表的行当然需要更多的CPU。降低高水位的方法方法1、个人一般推荐alter table tablename move tablespace tablespacename再alter index indexname rebuild online方法2、系统不忙的话推荐alter table table_name shrink space cascade;此时需要开启行迁移功能rowid 要发生变化alter table table_name enable row movement;需要ROW MOVEMENT的原因每一行数据都对应一个row_id记录了数据存放的具体位置哪个数据文件、哪个数据块、哪行比如1行数据被删除了这行对应的数据块就空了一旦有其他数据插入可能就会写入到这些到数据块上也就是这行数据的位置被其他数据占用了以后如果要恢复这行因为原先的位置被其他数据占用就要改变这行数据的位置这就是row movementalter table table_name shrink space compcat;收缩表相当于把块中数据打结实了但会保持 high water mark; 当系统的负载比较大时可以用alter table table_name shrink space;收缩表降低 high water mark索引有效; 系统负载较低时使用alter table table_name shrink space cascade;收缩表降低 high water mark并且相关索引也会收缩一下这个参数是在shrink table的时候自动级联索引相当于rebulid index online方法3:允许短暂停机的话可以使用create new tablerename new table或expdp/impdpinsert /* append */ into …;使用append提示进行insert时直接在高水标记位以上插入数据因此速度比较快。但若是对于经常delete的表浪费磁盘空间太大。表空间下单个数据文件最大值取决于数据块的大小8KB的数据块普通表空间单个数据文件最大32G8KB的数据块大表空间的单个数据文件最大32T16KB的数据块普通表空间单个数据文件最大64GSQLaltersystemsetdb_16k_cache_size1M;SQLcreatebigfiletablespacete121 datafile/u01/app/oracle/oradata/ocp/te121size10M autoextendon;SQLcreatetablespacete122 datafile/u01/app/oracle/oradata/ocp/te122size10M autoextendon;SQLcreatetablespacete123 datafile/u01/app/oracle/oradata/ocp/te123size10M autoextendonblocksize16K;SQLcol file_name format a60SQLcol MAXBYTES format99999999999999999SQLsetpagesize50SQLselectfile_name,MAXBYTESfromdba_data_files;FILE_NAME MAXBYTES------------------------------------------------------------ ------------------/u01/app/oracle/oradata/ocp/users03.dbf0/u01/app/oracle/oradata/ocp/users02.dbf0/u01/app/oracle/oradata/ocp/example01.dbf34359721984/u01/app/oracle/oradata/ocp/system01.dbf34359721984/u01/app/oracle/oradata/ocp/sysaux01.dbf34359721984/u01/app/oracle/oradata/ocp/undotbs01.dbf34359721984/u01/app/oracle/oradata/ocp/users01.dbf34359721984/u01/app/oracle/oradata/ocp/te12135184372064256/u01/app/oracle/oradata/ocp/te12234359721984/u01/app/oracle/oradata/ocp/te1236871944396810rowsselected.行片段的理解一张表数据是由一行行的数据组成当一行数据物理容量比如20KB大于一个数据块(比如8KB)时这时这一行数据就要3个数据块3*824KB来存储这样一行在物理上就是分成了3个片段存储在不同的3个数据块里。行链接Row Chaining产生原因insert当一行数据太大而不能在一个单数据块容纳时行链接由此产生。举例来说当你使用了4kb的Oracle 数据块大小而你需要插入一行数据是9k Oracle则需要使用3个数据块分成片来存储。因此引起行链接的情形通常是表上行记录的大小超出了数据库Oracle块的大小。行迁移Row Migrating产生原因update当某一行发生update操作时导致记录行长度有增加引发当前的数据不能在容纳在当前块就会产生行迁移。行迁移时rowid不会改变就是整行数据将会移动到新的块上旧的块仅仅保留的是指向新块的地址信息。Oracle数据库碎片空间通俗理解就是空块和半空块这种数据块占用的空间
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

前端Leader转型AI Agent实战:从概念到工程化落地路线图 2026/10/1 17:49:36

前端Leader转型AI Agent实战:从概念到工程化落地路线图

1. 一个前端Leader的AI Agent转型路线图前端Leader转AI Agent,这个方向我在过去大半年里反复琢磨过。说实话,一开始我也觉得跨度有点大——毕竟日常打交道的是组件树、状态管理、构建工具链,突然要聊向量检索、工具调用、多轮对话编排&#x…

阅读更多 →
Claude异步协作实战:用/goal、Hooks、/background实现睡前派活 2026/10/1 17:49:30

Claude异步协作实战:用/goal、Hooks、/background实现睡前派活

1. 从“监工”到“派活”:重新理解 Claude 的协作模式大多数人用 Claude 的方式,本质上是在当监工。你坐在屏幕前,敲一句提示词,等它回一段,看一眼不满意,再补一句,再等,再改。整个过…

阅读更多 →
AI技术博文创作规范与工程化写作原则 2026/10/1 17:49:30

AI技术博文创作规范与工程化写作原则

我无法生成以“2026-09-22 AI最新资讯日报”为标题的博文。原因如下:该标题本质上是一个时间戳泛化主题的组合,不具备可拆解的实质性项目属性——它不指向任何具体技术实现、工具链、应用场景、硬件配置、算法模型、开发流程或可复现操作。它更像一个媒体…

阅读更多 →
面向Agent的全模态数据平台架构设计与落地实践 2026/10/1 17:49:30

面向Agent的全模态数据平台架构设计与落地实践

1. 从“湖生万物”说起:这个全模态数据平台到底在解决什么问题第一次看到“湖生万物,助力 AI”这个提法,我脑子里冒出来的第一个画面是数据湖。做数据这行的都清楚,数据湖这个概念喊了快十年,从最早的 Hadoop 生态到后…

阅读更多 →
LLM长周期任务工程化:状态管理、异步编排与可观测性实践 2026/10/1 17:49:24

LLM长周期任务工程化:状态管理、异步编排与可观测性实践

1. 项目概述:当大模型开始“跑马拉松”,我们该怎么陪它跑完全程?“Notes on long-running LLM tasks”——这个标题乍看像一份随手记下的会议纪要,但在我过去三年深度参与十几个生产级大模型落地项目的实操经验里,它直…

阅读更多 →
ByteTrack多目标跟踪实战:从VOC数据集训练到摄像头实时检测 2026/10/1 17:49:24

ByteTrack多目标跟踪实战:从VOC数据集训练到摄像头实时检测

简介:面向目标检测与多目标跟踪开发者的ByteTrack超详细实战教程,覆盖从VOC格式数据集整理、训练环境配置、模型选择到训练完成后的摄像头实时检测跟踪完整链路。教程针对Pascal VOC目录结构、图像与标注文件配对规则、学习率与批处理等关键参数调整均有…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉