热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle数据库的逻辑存储结构

oracle通过数据块管理数据文件中的存储空间。数据块是数据存储的最小单位。在操作系统中,数据都是以位的方式进行存储。每个操作

oracle通过数据块管理数据文件中的存储空间。数据块是数据存储的最小单位。在操作系统中,数据都是以位的方式进行存储。 每个操作

本章主要介绍Oracle数据库的逻辑存储结构及其关系,包括以下内容
一、介绍data block,extent,segment
二、Data Block综述
三、Extent综述
四、Segment综述

一、介绍
数据块(Block):数据块是oracle的存储单位,也叫逻辑块,oracle块,是物理磁盘的一个空间。
区(Extent):一组数据块构成一个区。
段(Segment):由一组区构成,被分配到一个特定的数据结构中,段只能存储于一个表空间中,不能跨越表空间存储
当构成一个段的所有区空间满了后,系统需要分配其他的区给该段以便存储数据,这些新增的区可能是临近的也可能不是临近的。
段以及构成段的所有区只能存在于一个表空间中,但是段是可以跨越数据文件的,而区是不能跨越数据文件的。
如果分配一个区到一个特定的场合,那么区所包含的数据块同时也被分配过去。
如果区没有被分配到一个特定的场合,那么他所对应的数据块只有在高水位线改变的时候才会被分配。
高水位线是段中使用和为使用空间的一个分界线。
二、数据块综述
oracle通过数据块管理数据文件中的存储空间。数据块是数据存储的最小单位。在操作系统中,数据都是以位的方式进行存储。
每个操作系统都有个block size,而oracle中的data block size是操作系统数据块大小的倍数。在oracle中,数据块的大小由
初始化参数db_block_size决定。

数据块包含了header(包含基本信息,比如块地址,段类型),table directory(),rowdirectory,free space,row data
其中header,table directory,row directory统称为overhead,overhead大小有些固定有些可变,平均下来overhead大小
在84--107bytes之间。
row data 包含 table data或者index data。row可以跨越block
free space分配给那些需要增加额外空间以便insert或者update 数据。
Free Space Management
可以手动或者自动管理。bitmap方式对空间进行管理。当创建本地化管理表空间后,段空间即为自动管理,同时在该表空间
创建的其他段也同样为自动管理。
当free space不连续时,向该段insert数据,oracle会对这些不连续的block进行压缩、接合处理,,这将降低数据库的性能,
因此仅到出现block不连续时,数据库才会做如此操作。
Row Chaining and Migrating
当一条记录特别大,一个block不足以存储时,oracle会把这条记录存储在多个block中,并且把这些block连接起来,当成一个block
处理,这种情况在long和long raw型中经常出现。
当一条记录存储在一个block中,现被update,该blcok的空闲空间被占满,那么oracle将把这条记录从以前的block中移动到一个
新的block中存储,row id将不会改变。
当以上两种情况发生时,I/O性能会降低,因为oracle查询这条记录时将扫描不止一个block
PCTFREE PCTUSED
The PCTFREE parameter sets the minimum percentage of a data block to be
reserved as free space for possible updates to rows that already exist in that block.
PCTFREE定义一个数据块的最小空闲百分比。如在create table是设置了PCTFREE 20,那么这个segment中的每个数据块空间最多被insert占用到80%,剩下的20%,用来给update已经存在于该块中的数据用。
The PCTUSED parameter sets the minimum percentage of a block that can be used
for row data plus overhead before new rows are added to the block.
PCTUSED定义一个数据块能被insert 时的该块最小的空间占用百分比。如在create table时设置了PCTUSED 40,那么只有当占用百分比小于40%时,该块才能再次被insert数据。
此时感觉PCTFREE和PCTUSED有些矛盾,且看下面的定义。
PCTFREE、PCTUSED一起作用
在一个新分配的块中能用于insert 的空间为块大小减去 块头(overhead)及PCTFREE空间的总和后剩下的空间。update可以使一个数据块的可用空间小于PCTFREE。
每个data segment或者index segment都有多个free list,只有那些空闲空间大于PCTFREE且使用空间小于PCTUSED的块才会存在于FREE list中,可被选用。当发起insert时,ORACLE会检查free list中第一个可用块,当该块的空闲空间不足以满足该insert,该块将被ORACLE从该free list中丢弃。当insert并发时,一个段有多样的freelist 可以减少对freelist的竞争。
当一个新的块被用来insert时,最多能被使用到80%的空间,剩下20%用来update已经存在于该块中的数据,当占用率到了80%以后,如果该块的使用率一直在40%以上,那么将不能在insert into 数据到该块中。只要当该块的使用率变化到40%以下时,该块才会出现在free list中,且该块才可能被再次insert into数据,且最多insert 到80%。
当delete或者update 发生后,oracle会检查该块的可用空间,如果可用空间小于PCTUSED时,该块将被放到freelist中的起始位置供该事务使用,当commit后,可以被其他的transaction使用。
三、extent 综述
extent是数据库分配存储空间的一个逻辑单位,extent组成segment,构成段的extent的空间被使用完后,数据块立即分配新的区给segment使用。
When Extents Are Allocated
当创建一个表时,Oracle会分配一个初始的且指定block数量的extent给这个segment,即便没有行数据被insert into 这个表,与初始区对应的数据块还是为这个表的行数据保留的。当初始区空间被占满,且需要更多的空间来满足需求时,oracle自动的分配incremental extent以满足需求。
Determine The Number and Size of Extent
Storage Parameter表达了每个段中区的定义。storage parameter适用各种类型的segment,他们控制了空闲空间是如何分配给段的,比如你可以确定一个数据表需要分配多大的空间做为了初始空间,或者你可以根据create table时指定的存储参数限制分配给段的区个数。如果没有给一个段指定存储参数,那么将适用tablespace 的一些默认存储参数。
不管区管理方式是否明确指定,由于本地化管理的方式在性能上由于数据字典管理方式,非system的永久表空间都是本地化方式管理(local managed)。
在建立表空间时如果指定uniform,则指定了表空间的区为统一的大小,如果指定autoallocate则表空间的区大小为系统自动管理,是可变的。
对于uniform的方式管理区,指定区大小也可以使用默认的区大小,默认区大小为1M,临时表空间只能使用这种方式对区进行管理。
对于system-manage的方式管理区,ORacle确定增加区的最佳大小为最小64K,永久使用的表空间都默认是对区进行自动管理的。
存储参数initial,next,minextents,pctincrease并不是在tablespace这一级指定,是在段这一级指定。
How Extents Are Allocated
根据是本地管理表空间还是数据字典管理表空间,oracle利用不同的运算法则来分配区。本地化管理表空间,Oracle为一个新的区分配空闲空间时,在表空间中的一个候选datafile中查找所需的临近的空闲空间的block数量,如果数量不能满足需求,那么将查找下一个datafile。注意,区是不能跨越数据文件的。
When Extents Are Deallocated
通常情况下,只有在drop对象时,所占用的空间才会被释放给相应的表空间。除非在以下情况:
1、truncate ......drop storage
2、alter table table_name deallocate unused;
SQL> select sum(blocks) from dba_extents where segment_name='CLUB_BOOK_INFO_BAK1230';
SUM(BLOCKS)
-----------
2432
SQL> alter table club_book_info_bak1230 deallocate unused;
Table altered.
SQL> select sum(blocks) from dba_extents where segment_name='CLUB_BOOK_INFO_BAK1230';
SUM(BLOCKS)
-----------
2336
3、当给回滚段指定了最佳大小时,oracle会周期性的释放回滚段的空间。
当区变成free时,如果是本地化管理表空间,oracle会修改位于数据文件中的位图(bitmap),如果是字典管理表空间oracle会更新数据字典。
Extents in nonclusterd Tables
当你对非聚簇执行delete 后,不会释放这个表所占用的extents,只有当你drop时ORacle才会回收所占用的extents给这个表空间的其他需要空间的段。
Extents in clusterd Tables
当对聚簇的一个表进行drop后,并不能释放分配给他的区,因为聚簇的数据并不是给一个表用的。还包括了其他表的数据。
Extents in materialized views and their logs
在物化视图及其日志中,对区的释放和表及聚簇方式一样。
Extents in index
drop index后,释放相应的区。
Extents in temporary Segments
Oracle 完成一个需要临时段的任务后,会自动释放这个临时段。当多重排序完成后,并不释放临时段,而是保持其对其他的排序可用。当一个事务完成后,Oracle会把临时段drop掉并且返回临时段所分配的空间给临时表空间。
Extents in Rollback Segments
Oracle会周期性的检查回滚段,看他们的大小是否超过了一个设定的最佳值,当超过最佳值后,Oracle自动的是否一个或多个区。
四、Segment综述
段是由区组成的,数据段由Oracle分配一个或者多个区组成,索引段也同样是由Oracle分配的一个或者多个区组成的。
本节包含以上内容:
数据段介绍
索引段介绍
临时段介绍
回滚段自动管理
Introduction to Data Segment
在Oracle数据库中,一个单一的数据段保存着所有的数据库,数据段有以下形式:
1、非分区表
2、分区表的分区
3、聚簇
当用CREATE创建一个表或者聚簇,Oracle为他们创建数据段。存储参数决定了构成数据段的区是如何分配的。可以用CREATE或者ALTER设置这些存储参数,这些存储参数影响了数据恢复和存储的效率。
Introduction to Index Segments
非分区索引有一个索引段,分区索引一个分区有一个索引段。用CREATE index 创建一个索引或者一个分区索引时,ORacle会自动创建一个索引段存储参数决定了索引段的区是如何分配的。可以设置这些存储参数,他们会影响数据恢复和存储的效率。
Introduction to Temporary Segments
当执行查询时,Oracle需要临时空间来供SQL的分解和执行。临时段是Oracle自动分配的磁盘空间。Oracle需要一个临时段作为数据库空间供排序用。当排序可以在内存中完成或者Oracle找到其他的方法利用索引完成,Oracle是不会创建临时段的。
需要临时段的操作:
1、create index
2、select....order by
3、select distinct ...
4、select ...group by
5、select ....union
6、select ....intersect
7、select ....minus
Oracle为临时表以及他们的临时索引分配临时段。与分配临时段给查询相比,分配临时段给临时表的方式是不一样的。
Introduction to UNDO Segments
ORACLE强烈推荐使用UNDO表空间来自动管理,而不是使用rollback segment来进行管理。可以查看v$undostat视图,监控和配置数据库系统所使用的undo space。


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
author-avatar
妃你莫属L_957
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有