oracle数据库中表、段、区、块是什么意思?

oracle数据库中表、段、区、块是什么意思?,第1张

oracle的逻辑结构包括表空间(tablespace),段(segment),区(extent),数据块(data block)\x0d\x0aoracle数据库在逻辑上是由多个表间组成的,表空间中存储的对象叫段,比如数据段,索引段,和回退段。段由区组成,区是磁盘分配的最小单位。段的增大是通过增加区的个数来实现的。每个区的大小是数据块大小的整数倍,区的大小可以不相同;数据块是数据库中最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位。块的大小由参数DB_BLOCK_SIZE设置,其值应设置为 *** 作系统块大小的整数倍。\x0d\x0a表空间\x0d\x0a表空间是Oracle数据库最大的逻辑结构,一个Oracle数据库在逻辑上由多个表空间组成,一个表空间只隶属于一个数据库。Oracle中有一个称为SYSTEM的表空间,这个表空间是在创建或安装数据库时自动创建的。主要用于存储系统的数据字典,过程,函数,触发器等;也可以存储用户的表,索引等。一个表空间可以有多数据文件,但是一个数据文件只能属于一个表空间。\x0d\x0a一个表空间就是一片磁盘区域,他由一个或者多个磁盘文件组成,一个表空间可以容纳许多表、索引或者簇等。每个表空间有一个预制的磁盘区域称为初始区间(initial extent)用完这个区间后再用下一个,直到用完表空间,这时候需要对表空间进行扩展,增加数据文件或者扩大已经存在的数据文件\x0d\x0a段\x0d\x0aOracle中的段可以分成4种类型:数据段、索引段、回滚段、临时段。\x0d\x0a数据段用来存储用户的数据,每个表都有一个对应的回滚段,其名称和数据表的名字相同。索引段用来存储系统、用户的索引信息。回滚段用来存储用户数据修改前的值,回退段与事务是一对多的关系,一个事务只能使用一个回退段,而一个回退段可存放一个或多个事务的回退数据。临时段用于order by语句的排序以及一些汇总。\x0d\x0a区\x0d\x0a区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区存储于段中,它由连续的数据块组成。区的分配过程中,每次至分配5个区。如果所剩的空闲空间不够5个区,就会出现错误:ORA-01653。可以通过字典dba_tablespaces查询表空间中区的信息。可以通过字典user_tables查询段中区的信息。可以通过字典user_extents查询区的分配状况。我们可以通过以下SQL语句分别查询表空间、段、区中区的分配信息\x0d\x0aSQL>select * from dba_tablespaces\x0d\x0aSQL>select table_name, tablespace_name, min_extents, max_extents from user_tables\x0d\x0aSQL>select * from user_extents\x0d\x0a数据块\x0d\x0a数据块是数据中中最小的数据组织单位与管理单位,是数据文件磁盘存储空间单位,也是数据库I/O 的最小单位,数据块大小由DB_BLOCK_SIZE参数决定,不同的oracle版本DB_BLOCK_SIZE的默认值是不同的。

没弄明白你问的是什么?这里说几个想到的,看看有没有你要的。

oracle的访问控制方式可以有好几种说法:

用户控制(分到的用户不同,能访问的内容也可以有所区别,权限可以不同,所以叫做用户控制)

profile控制(每个用户的访问可以用相关的用户profile进行控制,比如限制同时登录数等等)

监听控制(举例来说,在监听文件中可以设置访问的ip段,或者访问的ip,其他ip不能访问,当然还有其他的能设定的)

区块(也就是oracle内部的block,这个算是oracle内部的数据访问控制方法)

位图(这个是oracle10g以及以后的数据文件访问方法)

还有权限控制,角色控制,参数控制(比如限制远程登录)等等

为了保持其最强大和最灵活数据库的地位 Oracle在最近发布的几个版本里一直都在创建新的机制来对表格和索引的存储进行简化和分块 从Oracle i开始 Oracle开始在tablespace内部将对象管理进行自动化 第一个增强的地方原来叫做本地管理tablespace(或者简写作LMT) 在LMT里 Oracle将tablespace里的信息从数据字典的表格空间里移出去 而直接将其保存到tablespace自身里 这在Oracle i里已经成为了一个事实的标准 因为它减轻了数据字典的负担

表格空间的第二个主要增强的是自动分段空间管理(ASSM) 它首次出现在Oracle i里 有了ASSM 链接列表freelist被位图所取代 它是一个二进制的数组 能够迅速有效地管理存储扩展和剩余区块(free block) 因此能够改善分段存储本质

管理空间的两种方法

让我们从比较这两种空间管理开始

本地管理tablespace(LMT)——LMT是通过把EXTENT MANAGEMENT LOCAL子句添加到tablespace的定义句法而实现的 和原来由字典管理的tablespace(DMT)不同 LMT会将扩展管理自动化 并保持Oracle DBA不会被用来指定管理扩展大小的NEXT存储参数 这个原则唯一的例外是在NEXT和MINEXTENTS一起用在表格创建的时候

自动区段空间管理(ASSM)——ASSM的tablespace是通过将SEGMENT SPACE MANAGEMENT AUTO子句添加到tablespace的定义句法里而实现的 通过使用位图freelist取代传统单向的链接列表freelist ASSM的tablespace会将freelist的管理自动化 并取消为独立的表格和索引指定PCTUSED FREELISTS和FREELIST GROUPS存储参数的能力

Oracle值得赞扬的地方是 这两个空间管理的方法都是可选的特性 而且Oracle的老手可能仍会使用更加详细的方法 只要他们愿意的话 要注意 位图区段管理在Oracle i里是可选的 而且只能在tablespace这一层实现 这一点是十分重要的 原有的系统还能够继续使用传统方法来管理freelist

位图freelist挑战传统的空间管理

在我讨论位图freelist和传统的空间管理之前 让我们看看位图freelist是如何实现的 我会从使用区段空间管理自动参数创建tablespace开始

create tablespace  a *** _lmt_tsdatafile  c:\oracle\oradata\diogenes\a *** _lmt dbf size  mEXTENT MANAGEMENT LOCAL  Turn on LMTSEGMENT SPACE MANAGEMENT AUTO Turn on ASSM

    一旦你定义好了tablespace 那么表格和索引就能够使用各种方法很容易地被移动到新的tablespace里 下面就是我进行创建的代码

create table  new_custtablespace  as *** _lmt_tsas  select * from customeralter index cust_name_idx rebuild tablespace as *** _lmt_ts 

    要注意 当表格或者索引被分配到这个tablespace以后 用于独立对象的PCTUSED的值会被忽略 而Oracle i会使用位图数组来自动地管理tablespace里表格和索引的freelist 对于在LMT的tablespace内部创建的表格和索引而言 这个NEXT扩展子句是过时的 因为由本地管理的tablespace会管理它们 但是 INITIAL参数仍然是需要的 因为Oracle不可能提前知道初始表格加载的大小 对于ASSM而言 INITIAL最小的值是三个区块

关于一个万能的方法对于Oracle来说是否是最好的方法还有一些争论 在大型数据库里 单独的对象设置会带来性能和存储上的巨大不同 PCTFREE的问题

PCTFREE参数是用来指定数据块剩余空间大小的 这一空间为将来数据行的扩展而保留 如果PCTFREE设置得不得当 SQL的更新声明就可能导致大量的数据行碎片和断链

数据行在刚保存的时候还很小 而在后来进行了扩展 在这种情况下 PCTFREE的设置就显得尤其重要了 在这样的系统里 通常会把PCTFREE设置成等于 这就告诉Oracle要为数据行今后的扩展保留 %的数据区段空间

PCTUSED的问题

对PCTUSED不正确的设置(例如设得太小了)会导致SQL插入声明性能的急剧下降 如果数据区块剩余空间不是很多 那么在SQL插入 *** 作的过程中就会产生过量的I/O 这是因为被重新使用的Oracle数据区块会被迅速地填满 从极端的角度来看 没有正确地设置PCTUSED会导致数据区块的剩余空间要比表格数据行的平均长度小 在这样的情况下 Oracle会五次尝试从freelist链取回区块 在五次尝试以后 Oracle会提升表格的水位 并为插入 *** 作腾出五个新的数据块

有了Oracle i的ASSM PCTUSED就不再控制表格数据块的重新链接阙值了 但是你必须依靠Oracle的判断来确定区块在什么时候会有足够的剩余空间放置到freelist里

尽管有了本地管理的tablespace和ASSM之后Oracle i会忽略PCTUSED FREELISTS和FREELIST GROUPS等参数 但是当它们用于表格定义的时候 Oracle还是不会给出错误信息

SQL>create table test_table (c number) tablespace a *** _test pctfree pctused storage ( freelists next m ) Table created

    如果你不记得带有ASSM的本地管理tablespace会略掉任何为PCTUSED NEXT和FREELISTS所指定的值的话 这将是一个十分严重的问题

使用ASSM的一个巨大优势是 位图freelist肯定能够减轻缓冲区忙等待(buffer busy wait)的负担 这个问题在Oracle i以前的版本里曾是一个严重的问题 现在让我们来仔细看看这个特性

在没有多个freelist的时候 每个Oracle表格和索引在表格的头部都曾有一个数据块 用来管理对象所使用的剩余区块 并为任何SQL插入声明所创建的新数据行提供数据块 当数据缓冲内的数据块由于被另一个DML事务处理锁定而无法使用的时候 缓冲区忙等待就会发生 当你需要将多个任务插入到同一个表格里的时候 这些任务就被强制等待 而同时Oracle会在同时分派剩余的区块 一次一个

有了ASSM之后 Oracle宣称显著地提高了DML并发 *** 作的性能 因为(同一个)位图的不同部分可以被同时使用 这样就消除了寻找剩余空间的串行化 根据Oracle的测试结果 使用位图freelist会消除所有分段头部(对资源)的争夺 还能获得超快的并发插入 *** 作(图A)

= ) window open( /sql/UploadFiles_ / / jpg )src= if(this width >)this width = if(this height >) this height = border= >

图A Oracle公司对使用位图freelist进行SQL插入 *** 作的测试结果

ASSM的局限性

尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作 但是Oracle i的位图分段管理还是有一些局限性的

一旦DBA被分配之后 它就无法控制tablespace内部的独立表格和索引的存储行为

大型对象不能够使用ASSM 而且必须为包含有LOB数据类型的表格创建分离的tablespace

你不能够使用ASSM创建临时的tablespace 这是由排序时临时分段的短暂特性所决定的

只有本地管理的tablespace才能够使用位图分段管理

lishixinzhi/Article/program/Oracle/201311/17754


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6713768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存