翻译: Oralce官方文档-- Data Blocks, Extents, and Segments

Data Blocks, Extents, and Segments
                                                                  --数据块,区,与段
原文:
docs.oracle.com/cd/B28359_01/server.111/b28318/logical.htm#i8531

这一章描述了Oracle数据库存储结构的逻辑,性质和联系。
包含了下列概要:
1.Data Blocks, Extents, 和Segments的介绍
2.Data Blocks 的概述
3.Extents 的概述
4.Segments 的概述


1.Data Blocks, Extents, 和Segments的介绍
Oracle为数据中所有数据都分配对应的逻辑空间, 而逻辑空间的单位就包括Data Blocks, entents, and Segments.
图例2.1 描述了它们之间的关系
翻译: Oralce官方文档-- Data Blocks, Extents, and Segments - 饥民 - 饥民2011



作为最小存储单元, oracle会将数据存入Data blocks中(数据块,也有人称为 logical blocks, Oracle blocks 或pages), 1个Data blocks 对应1个指定大小的字节数(block size 通常在创建数据库时指定)的硬盘物理空间。也就说每个data block 大小都是一样的,上图中是2kb.

上一层的存储单位叫Extents(中文名一般叫区), 1个 extents 通常是一定数量的相邻的data blocks 组成, 用于存放指定类型的数据。 

再上一层的存储单位就叫做Segments了(段),  1个Segments 是有一组extents组成的,而对应每1个extent都被分配存放指定的数据类型,而且它们都在同1个表空间中。
例如,每1个table 都存储在它自己的data segment中(数据段), 而每1个index 都存储在它自己的index segement 中(索引段).如果表或索引是分区(partitioned)存储的,那么对应每1个分区会拥有自己的segment.

每个Segement 和它包含的extents都只能存放在1个表空间(table space)中,  如果表空间包含若干个数据文件(data file). 那么1个Segement 是可以包含存放在不同数据文件的extents的。 也就是说,segement是可以跨数据文件存储的,而extents只能放在1个数据文件中。

虽然你可以额外添加1个extent, 但它的blocks未必会同时分配,如果你将1个extent分配到1个指定的实例(数据库对象)中,那么它的blocks会马上分配并加到可用块列表中(free list).  然而如果你不是将1个extent 分配到指定实例中的话,那么它的block只会等到高水位线(high water mark)移动时才分配。高水位线是1个segment中已用和未用空间的界限。


2.Data Blocks 的概述
在Oracle的存储空间管理中, 1个数据库的数据文件内的存储单位叫Data blocks, 1个Data block 是数据库中最小的数据存储单位。然而,所有数据在操作系统中的物理存储单位是字节(byte). 每1个操作系统都有它自定义的块大小(block size). Oracle会将数据存放在oracle自定义的data blocks中, 而不是操作系统本身的系统块(blocks).

Oracle标准Block size 是由数据库初始参数DB_BLOCK_SIZE指定的。除此之外,你还可以指定最多5个非标准的Block size, 你应该将oracle Block size 设成操作系统Block size的倍数, 以最大限度地避免多余的I/O。Oracle data blocks 是oralce可以使用和分配的最小的存储单位/

2.1 Data Block 的结构。
Oracle数据库的Data blocks的结构是类似的。不论它们存放的是table,index或者clustered data(簇表)。
图例2.2 表示了data block的结构。




这一小节我们讨论下面这些Data Block的组成部分.

2.1.1 数据块头(含标准内容与可变内容)                        #Header(Common and Variable)    
2.1.2 表目录区                                                               #Table Directory
2.1.3 行目录区                                                               #Row Directory
2.1.4 头部信息                                                               #OverHead
2.1.5 行数据区                                                               #Row Data
2.1.6 可用空间区                                                               #Free Space

2.1.1 数据块头(含标准内容和可变内容)
数据块头包含基本的Data Block信息,例如 Block的地址和所属段的类型.(例如,数据段\索引段)

2.1.2 表目录区
这部分包含Data Block中的数据行所属表的信息.

2.1.3 行目录区
这部分包含Data Block中的数据行的信息.(每一条数据行(或数据行的一部分)的地址).
注: 1个data block可能包含一条或多条完整的数据行,或者一条数据行的一部分.

当数据块行目录被分配后,即使对应数据行被删除,这部分空间也不会被回收. 例如,1个数据块曾经包含多达50条数据,但被清空后,行目录区人仍然保留100 bytes的行目录数据. 只有当有新的数据行被插入的这个Data Blocks, Oralce才会对该行目录空间重新分配利用.

2.1.4 头部信息
数据块头,表目录区,行目录区被共同地成为头部信息.  有些Data block的头部信息是固定大小的. 而头部信息的总大小是可变的(也就是说有写是可变的).平均来讲, 头部信息的固定和可变部分总共为84-107 bytes.

2.1.5 行数据区
这部分包含数据表或索引的内容, 数据行可以跨Data Blocks存储.

2.1.6 可用空间区
可用空间是预留给新数据行的插入或者现有数据行的更改(例如将1个Null值改为1个非Null值)

如果1个Data Blocks是属于Data segment存放表数据, 或 Index segement而存放索引数据。那么它的可用空间还会存放transaction entry(事务条目),在每一次对数据块中的一行或多行进行 insert/update/delete 和select.. for update操作时,可用空间就需要存放一条transaction entry. transaction entries的所需空间取决于擦作系统,在大部分操作系统里是23 bytes左右。

2.2 可用空间管理
可用空间可以由系统自动管理或者手动管理。
数据库 segments 里面的可用空间可以被系统自动管理, segment 内的可用/已用空间用Bitmap形式记录(tracked using bitmap), 与用列表(free list)管理不同,segment 空间自动管理具有如下优点:

      * 易与使用
      * 更优秀的空间利用率,特别是对于那些每行数据大小差异大的对象来说。
      * 对并行访问情况变化进行更好的实时调整。
      * 多实例运行时,有更优秀的性能和空间利用率。(
Better multi-instance behavior in terms of performance/space utilization)

当用户创建1个本地管理的表空间时,可以设定自动segment空间管理。这个设定会应用到这个表空间创建的segment.


2.2.1 Data block 中可用空间的有效性和优化
有两种操作语句可以为1个或多个Data blocks增加可用空间:  分别是Delete语句和某些Update语句(将已存在的值更新为占更小空间安的值). 释放出的空间有随后符合以下两个条件的insert语句所使用。
         * 如果insert语句在释放空间的语句之后,而且和释放空间的语句在同1个事务内,那么这些insert语句可以使用释放出来的空间。
         * 如果insert语句和释放空间的语句在不同的事务中(或者由不同的用户提交),那么只有当释放语句的事务提交之后,且insert语句必须使用这些释放空间,  这些释放空间才会被Insert语句所使用。

在1个Data Block中,loin987z空间相邻, Oralce只会遇到下列两种情况才会合并可用空间。
1)inertupdate语句选中1个足够存放新数据的可用空间。
2) 本身可用空间过于分散,数据无法写入1个连续的可用空间里。
Oracle之所以在这些情况才会做合并可用空间的动作。是因为频繁进行合并动作进性时会影响数据性能。

2.2.2 行链接和行迁移 Row Chaining and Migrating
有两种情况会导致1个数据行太大,不能放入1单个Data Block中.  第一种情况,当一个数据行在第一次插入数据库时就由于本身size太大而不能全部放入1个Data Block中,在此情况下,Oralce会将这个数据行存放在由1个Segment中的一组Data Blocks组成的链接(chain)中。行链接的形成大部分是由于大容量的数据行,例如数据行中有类型是LONG 或 LONG,在这情况下行链接是不可避免的。(除非加大Block Size).

然而,第二种情况是,有1个数据行原本已经完全存放在1个Data Block中, 但是由于Update动作, 数据行的总大小变大了。 而那个数据的可用空间此时已被占满(可能由其他数据行占满)。 在这种情况下,oracle会将这条数据行迁移(migrate)到(整条)到1个新的Data Block中。Oracle会在旧Data block中数据行原位置保存1个指针指向那个新的Data Block。 原rowid 保持不变。

当行迁移或行链接发生时,对有关于这个一行的I/O性能会下将, 因为数据库必须扫描额外的Data Block来检索数据行的全部信息。
 
2.2.2 PCTFREE, PCTUSED, and Row Chainning 
                                               -- Pctfree, pctused 和 行链接

下面这小part是我自己添加的
======================================================

Segment 管理方式有两种:(管理Block)
1 MSSM(Manual Segment Space Management)
2 ASSM(Auto Systemt Space Management)


1 MSSM(Manual Segment Space Management)
通过在segment的段头分配自由列表(freelist) 来管理block
通过两个参数 pctfree pctused来管理block如何进出freelist
pctfree 值表示预留多少%的block空间用于更新
pctused 值表示低于这个值是,block会重新加入到freelist上

通过dba_tables,dba_indexes查看freelist,pctfree,pctused等参数的设置

2 ASSM(Auto Systemt Space Management)
通过在segment的段头分配位图(bitmap) 来管理block
不再需要freelist
不在需要pctused,因为不需要从freelist上摘除block。


可以在user_tablespaces 这个视图查看Segment_Space_Management
列,
获得模式类型。

======================================================

在手动管理(
MSSM)的表空间中,有两个空间管理参数, PCTFREE PCTUSED,允许用户通过这两个参数在某1个segment中进行insert 和 update操作时,对该segment 中所有data blocks的可用空间进行管理。用户可以在创建或修改一张数据表或簇表(有属于自己的segment)时设定这两个参数,用户也可以在创建或修改index(有属于自己的segment) 时指定数据存储参数(Storege paramter) PCTFREE 。
df
下面包含下列内容.

            * PCTFREE 参数
            * PCTUSED 参数
            * PCTFREEPCTUSED 是怎么一起工作的

            ------------------------------------------------------------------------------------------
               注:我们讨论的范畴不包括LOB 数据类型(BLOB,CLOB,NCLOB和BFILE),它们不会使用PCTFREE参数
                   或free list(可用块列表).
 


2.2.3 PCTFREE 参数
用户可以用PCTFREE 参数来设置Data Block中预留给update操作的可用空间百分比,用来为已存在数据的长度增长做准备。
例如, 假如你执行Create table语句时加入这1个参数

PCTFREE 20

这样就声明了,在这个表(表空间的对应segment)中的每1个Data blocks中, 会保留20%的可用空间 预留给Update操作造成的数据长度增长,新的数据行会存储入Row Data Area, 而相应的信息会存储入Overhead Area( 2.1.4 头部信息)的可变部分, 直到Row data和overhead的总容量达到Data block容量的80%.
图例2.3 阐明了PCTFREE的作用:

翻译: Oralce官方文档-- Data Blocks, Extents, and Segments - 饥民 - 饥民2011
 

2.2.4 PCTUSED 参数
PCTUSED 设置了1个最小百分比,当Data Blocks的已用空间(row data + overhead)占总空间的比率小于PCTUSED时,才允许新数据行插入到这个Data Block中。 当Data block的已用空间到达PCTFREE的限制时, Oralce 就不允许新数据行的插入,直到已用空间的比率下降到PCTUSED设定的比率. 否则Oracle只会用那些可用空间提供给已存在数据行的update操作。
例如,当你创建1个数据表同时指定如下参数

PCTUSED 40

这个表(表空间的对应segment)中的每1个Data blocks中, 除非已用空间比率在39%或者更低(假设那个Data block的可用空间曾经下降到达PCTFREE的限制)。

翻译: Oralce官方文档-- Data Blocks, Extents, and Segments - 饥民 - 饥民2011
 

2.2.5 PCTFREE 和 PCTUSED 共同起作用的
在1个segmenet中,PCTFREEPCTUSED 会共同作用以优化Data blocks的空间使用。
图例2-5 显示了这个两个参数的相互作用。


翻译: Oralce官方文档-- Data Blocks, Extents, and Segments - 饥民 - 饥民2011
 
图1:数据行能一直插入值到已用空间到达80%, 这是因为PCTFREE 设定要保留20%的可用空间预留给已存在行的Update操作。
图2: 更新造成的数据长度增长会占用这些保留的空间,新的数据行不允许插入,值到已用空间降到(更新或删除)39%或更低。
图3:当已用空间降到40%以下时,新数据行又可以插入到这个Data Block中了。
图4:数据行能一直插入值到已用空间到达80%, ..这个逻辑一直循环下去。


在1个新使用的Data block中,数据行Insert的操作可以使用的空间是Data Blocks总空间 减去 头部信息和PCTFREE的和。而update已存在数据行的操作能使用Data block中任何可用空间,因此update操作一样有机会令可用空间减少低于PCTFREE的限制,PCTFREE保留的空间是为了Update操作准备的,而不是Insert

对于每1个数据和索引Segmentoracle都会维护一个或多个Free List -- 分配给该Segment的数据区(extends),而且可用空间大于PCTFREE的Data Blocks列表. 这些Data Block可以被插入新数据行. 当你提交一条insert语句,Oralce就会检查Free List中的第1个Data Block,如果它是可用的,就会使用它。 若它的可用空间不足以容纳那条insert语句,而且该Data Block的可用空间已经超过PCTUSED(如上图,例如已用41%,超出PCTUSED的40%),ORACLE就会将该Data Block移出Free List.1个segment里允许有多个Free list,这样减少了并发Insert操作时对单个Free list的争用。

当用户提交1个Deleteupdate操作,Oracle就会执行这些语句然后会检查对应Data Blocks中的已用空间是否已经低于PCTUSED,如果是,则将Data Block则进入Free list成为该事务第首个可以使用的Data Block。当对应事务被提交,该Data Block 可以被其他事务使用。


3 Extents概述  (overview of extents)
1个Extent 就是数据库中由1组连续的Data Blocks组成的存储逻辑单位. 1个或多个Extents组成1个Segment,当1个Segment中的extents被用完,oracle会分配新的extend给该segment.

这一节包含如下内容:
    * Extents何时被分配
    * Extents数量和大小的决定
    * Extents怎样被分配
    * Extents何时被回收


3.1 Extents 何时被分配
当你创建1张表时,Oralce会为哪张表的segment分配1个有一组指定数量Data blocks组成的initial extent(初始区), 即使当时还没有数据行插入,那些相应的Data Blocks还是会预留为那张表的数据行使用.

如果上面的initial extent的空间用完了,而且需要更多的空间来装在表数据,那么oracle就会分配1个incremental extent(增加的区),1个incremental extent是1个后续的extent,容量大于或等于该表segment中之前的extents.

出于方便维护的目的,每个segment中头1个Data block会存储该segment中的地址信息。

               -------------------------------------------------------------------------------------------------------------------
               注:这一章使用于Serial operations(串行操作,也就是1个1个来的意思),即是
         那些之有1个服务进程,运行1条sql语句的操作。 对于那些被多个服务进程并发执行
         的sql语句(parallel SQL statements),entents的分配会有点不同。

               -------------------------------------------------------------------------------------------------------------------
          
3.2 Extents数量和大小的决定
每个segment中,Storage paramter(存储参数)可以表示出extends的定义。Storage Parameter适用于所有类型的segments. 它们可哦就控制了oracle应该怎样分配数据库可用空间给1个segment. 例如你可以在执行Create table 语句时使用Storage 字句来 指定segment中初始预留空间的大小,也可以限制分配给segmentextents数量。如果你没有指定Storage paramter, 那么系统会使用表空间的默认Storage parameter.

用户可以使用由数据字典(dictionary)来管理的表空间,那些表空间会依赖数据字典来监控空间利用情况,也可以使用本地管理(locally managerd)的表空间, 那些表空间会用位图(bitmap)来标记已用空间(而不是用数据字典)。因为本地管理方式有更好的性能而且更容易管理,所以当用户没有指定extent的管理方式时,除了System的永久表空间(permanent tablespaces)默认使用本地管理方式。

          
注:上述管理类型可以在user_tablespaces 中的 extent_management 列查询.

1个本地管理模式的表空间的extends要么是固定大小的(所有extendssize是一致的),要么是由系统自动决定大小而且大小非固定的。当你创建1个表空间,UNIFORM 和 AUTOALLOCATE(系同管理)子句可用来决定分配类型

          * 对于固定大小的extends, 你可以指定1个值或者使用默认的size,默认是1MB,
      要确保每1个extends至少含有5个Data blocks 的大小, 本地管理的
      临时表空间(
Temporary tablespaces)只能使用这种分配方式(固定大小)。
  
          * 对于系统自动管理的extends, oracle自己会为additional extents决定最优的size,
      而1个extends的size的最小值是64kb. 如果一张表空间创建时包含字句
      "
segment space management auto", 而且数据库的
      Block size大于等于16KB,那么oracle在使对应的segment创建最小值
      为1MB 的extends. 上面所说的是永久性表空间的默认值。

在本地管理方式的表空间中,存储参数 INITIAL,NEXT,PCTINCREASEMINEXTENTS不能被设定于表空间这一层,但是,他们可以在segment这个层面上设定。在这种情况下,INITIAL,NEXT,PCTINCREASEMINEXTENTS这4个参数会一起计算segment的初始大小值。segment的初始大小值计算完后, 随后内部算法会决定segment里每1个extents的大小。


3.3 Extents怎样被分配.
Oracle使用不同的算法去分配Extents, 取决于他们是数据字典管理类型还是本地管理类型的。

在本地管理类型的表空间中,oracle为了给1个新分配的extent寻找可用空间,会首先选中表空间的1个候选的Data file(数据文件),然后会检查这个datafilebitmap,寻找所需数量连续的Data blocks. 若该datafile里没有足够的连续空间,则会选择另1个datafile继续查找。

          注:Oracle强烈建议你使用本地管理类型的表空间。

3.4 Extents何时被回收
Oracle提供1个 Segment Advisor(顾问)工具, 会基于1个对象内的空间碎片,帮助你了解该对象内是否有空间可以用来回收再利用。

通常,1个segment内的extends不会返回表空间中,除非你删除存放在该segment的数据库对象(使用Drop table Drop cluster语句)。
但是下面的情况是例外:
 
      * 一张tableclusterowner,或者1个拥有Delete任何东西权限的user,可以
      截断(truncate)1张tablecluster(使用TRUNCATE...DROP STORAGE语句)

      * 1个数据库管理员(DBA) 可以通过下面的SQL语句来回收未使用的extents. Orz..
        ALTER TABLE table_name DEALLOCATE UNUSED;

      * Orace会定期从1个回滚段(rollback segment)回收1个或多个extents.
        前提是那个segment的参数OPTIMAL size已被设定

   
extends被释放,Oracle会修改相应datafileBitmap(for 本地管理类型表空间),或者修改相应datafiledictionary(for 数据字典管理类型的表空间)来表明被回收的extents是可用的. extends内任何Data blocks内的数据会被释放,从而extends也不能被访问。

这一节包含以下topics:
       
      * 非簇表的extends     #extends in Nonclustered Tables
      * 簇表的extends        #extends in Clustered Tables
      * 具体视图及其日志中的extends  #extents in Materialized Views and Their Logs
      * 索引中的extent

      * Temporary Segments 中的 extents

      * Rollback Segments 中的 extents



3.4.1 非簇表的extents     #extends in Nonclusterd Tables
只要1张表还存在于数据库中,那么分配给该表的segmentData blocks会一直保留在那,除非这张表被trancate了。若1个data block还有可用空间,oracle会将新数据行插到它里面。即使你用把该表的所有行都Delete了, oracle也不回收该表的data blocks 而用于表空间的其他对象。

当你把这张表drop掉之后,当别的extents需要新空间时会回收原本该表的空间。 ---- oracle 会回收这张表的data segmentsindex segments里所有的extents, 并供同一个表空间内的其他方案对象(schema objects)使用。

在数据字典管理类型的表空间中,当1个segment所需的extents长度大于可用的extents长度时,oracle会寻找并将回收的extents合拼成1个大的连续extent.  这就是extents合拼(coalescing). extents 合拼在本地管理类型 (locally managed tablespace)的表空间中并不是必需的,因为所有连续空间都能被分配给1个新的extent, 而不管这些空间是不是从1个或多个extents中回收的.

3.4.2 簇表的extents     #extends in Clusterd Tables
簇表的数据存放专门的为簇而建立的segment中. 所以当你drop掉簇里的1张表, 对应的segment就会预留给簇的另一张表,没有任何extents被回收. 你亦都可以truncate 簇(除了哈希簇)来释放extents.

3.4.3 具体视图及其日志中的extends  #extents in Materialized Views and Their Logs
Oralce回收具体尸体及其日志中的extents的方式是和表和簇的方式一样的.

3.4.4 索引中的extent
只要1个index 还存在,oracle都会为其保留住分配给它的index segement. 当你drop这个index 或者对应的表或簇, oralce 会回收这些extents, 分配给对应的表空间用于其他地方.

3.4.5 Temporary Segments(临时段) 中的 extents
当oracle执行完1个用到temporary Segment的语句时, Oracle会自动drop掉那个temporary segment, 并收回里面的extents给对应的表空间.
当用户执行1个单一排序(single sort)语句时,1个temporary tablespace(临时表空间) 建立自己的temporary segments , 执行完后会释放那些extents到表空间中.

但是在Multiple sorts(多重排序)中, 可使用temporary tablespaces中专门指定给排序用的segments. 这些sort segments 对于那个instance(实例)只能分配1次, 排序之后它们不会被回收, 但是为会被其他
Multiple sorts排序.

1张临时表里的 temporary segment 可以含有1个trancaction(事务)或session(会话)的多条SQL语句的数据. 当事务或会话结束后oracledrop那个temporary segment,收其中的extents给对应的表空间.

3.4.5 Rollback Segments(回滚) 中的 extents
Oracle会定期检查数据库中的Rollback segments, 看看它们是否已经超过了最佳的大小( optimal size),如果1个 Rollback Segment的size超过了 optimal size(也就是说里面有太多 extents了), 那么oracle会自动回收它里面的1个或多个 extents.


4 Segment概述  (overview of Segment)
1个 segments 就是在表空间内由一些包含所有特定逻辑结构的 extents组成的存储结构. 例如, 对于每一张表, oracle会分配1个或多个 extents形成该表的Data segment,  而对于每1个 index, oracle会分配1个或多个extents形成该indexindex segment.

这一章节包含如下topics:
        
           * Data Segments 介绍
           * Index Segments 介绍
           * Temporary Segments 介绍
           * Undo Segments 介绍 和 Automatic Undo Management
   
4.1 Data Segments 介绍
Oracle中1个 Data Segment 包含下列对象的所有数据.

           * 1张 table, 而它不是分区表且不是簇表.
           * 1张分区表里面的1个分区
           * 1个簇(含多张表)

当你执行创建1张 tablecluster的语句时 Oracle就会为其创建对应的 Data segment.

表或簇的存储参数决定了对应的 Data segmentextents 是怎样分配的. 用户可以直接在 CreateAlter 语句中设定这些存储参数. 这些参数会影响其 Data segment中数据检索和存储的效率.

                             ---------------------------------------------------------------------
                            注:Oracle为物化视图(
materialized view)创建segment的方式是和tablescluster
                   一样的.

                            ---------------------------------------------------------------------


4.2 Index Segments 介绍
对于1个非分区索引, oracle会存有1个对应的 index segment来存放它的所有数据,对于1个分区的索引,每个分区都有1个对应的index segment存放它的数据.

当用户执行创建索引的语句时,oracle会为该索引或索引分区建立Index segment. 用户可以指定 index segmentextents存储参数 和指定创建 index segment的表空间.(1张表和它的索引可以使用不同的表空间). 这些参数会影响其Data segment中数据检索和存储的效率.

4.3 Temporary Segments 介绍
当用户执行查询时, Oracle通常要为Sql语句的分析和执行的中间阶段( intermediate stages)准备临时空间. Oralce会自动分配这些硬盘空间并称之为 Temporary Segment. 例如, Oracle 需要1个 Temporary Segment用于排序的数据库空间. 如果该排序操作可以在内存内完成或者 oracle找到另1中使用索引去排序的方法, 则oracle不会创建 Temporary segment.

这一小节包含如下topics:
              * 需要 Temporary Segments的操作
              * 临时表和他们的索引的Segments.
              * Temporary segments 是怎样分配的.

4.3.1 需要Temporary Segments的操作
下列语句有时会需要用到Temp orary segments:
           
              * CREATE INDEX
              * SELECT ... ORDER BY
              * SELECT ... DISTINCT
              * SELECT ... GROUP BY
              * SELECT ... UNION              #联集
              * SELECT ... INTERSECT       # 交集
              * SELECT ... MINUS              #差集,  即是存在与第一张表中并且不存在第二表的记录.

有些没用到索引的连接或关联子查询也会需要用到 temporary segment. 例如, 如果1个查询含有1个 DISTINCT条件,1个 GROUP BY 和 1个 ORDER BY , Oracle可能会需要多达两个 Temporary segments.

4.3.1 Temporary Segments 是怎样分配的
Oracle会按照各需求分配各种不同的Temporary segment.
这一小小节 包含如下两个topics

                * 为查询分配Temporary segments
                * 为临时表和索引分配Temporary segments.                

4.3.1.1 为查询分配Temporary segments
当用户在1个会话(session)期间内执行SQL语句, 若需要,Oralce 在其中1个临时表空间按需分配Temporary segments. 用户可以在CREATE USER or ALTER USER 语句中使用 Temporary Tablespace 来指定该用户所使用的临时表空间.

                            ---------------------------------------------------------------------
                            注:你不能分配1个永久性表空间作为1个用户的临时表空间.
                   该属性存放在 user_tablespaces CONTENTS列中.

                            ---------------------------------------------------------------------
            

如果没有为用户指定1个临时表空间,那么用户的临时表空间就是系统的临时表空间(TEMP).  表空间的默认存储特征(characteristics)决定了其temporary segments内的extents的存储特征.  当用户执行完sql语句, oracle会移除掉对应temporary segments.

因为对temporary segments的分配和回收相当频繁, 为那些temporary segments创建至少1个特别表空间,可以分散对磁盘的读写, 也可以避免在SYSTEM或其他存有temporary segments表空间因为这个原因产生的碎片.

                           

                             ---------------------------------------------------------------------
                            注:SYSTEM 表空间(名字为SYSTEM)是本地管理类型, 用户创建1个数据库时必须定义
                                   1个临时表空间. 1个本地管理类型的SYSTEM表空间不能被作为默认的临时存表空间.
                            ---------------------------------------------------------------------
            


用于排序而对temporary segment的改动不会被写入redo log(重做日志), 除非是对temporay segment做关于空间管理的操作.

4.3.1.2 临时表和索引分配Temporary segments
当用户执行对临时表的第一条insert into语句(这个可以是1个由CREATE TABLE AS SELECT 语句引起内部insert操作)时,Oracle 就会为其分配1个temporary segment.  当第一个INSERT 执行时, Oracle为其对于的临时表和索引分配 segments, 同时创建
root page 和所有的LOB segments.

用于临时表的segments被分配于表临时表创建者的临时表空间中.

对于事务创建(transaction-specific)的临时表, oracle会在事务结束时移除其temporary segments. 对于会话创建的临时表(session-specific) , 其temporary segments则会在会话结束时被移除. 如果其他事务活会话也用到那张临时表,则那些segments 仍然保留该临时表的数据.


4.4 Undo Segments 介绍 和 Automatic Undo Management (回滚段与自动撤销管理)
Oracle 维护着对数据库撤销改动的信息. 这些信息由事务动作的记录构成, 这就被共同认为是Undo. Undo 存放在Undo 表空间
undo segments中. Oracle 利用Undo信息去做下列的操作.
              * 回滚1个活动的事务(active transaction)
              * 回复1个被中止的事务(terminated transaction)  #按我的理解这里不是指执行完的事物.而是挂掉的事务.
              * 提供一致性读 (Provide read consistency)
              * 修复逻辑错误 (Recovery from logical corruptions)


截图是我自己截的Undo 表空间和临时表空间

翻译: Oralce官方文档-- Data Blocks, Extents, and Segments - 饥民 - 饥民2011


当1个 Rollback语句被提交时, Undo 的记录就会被用来回滚由未提交事务造成的数据库改动.  而当在数据库修复时, Undo的记录是用来回滚 从重做日志( redo log)到数据文件的任何未提交的改动. 当个1个用户访问 正在被其他用户修改的数据时, Undo记录通过维护这个用户的前映像( before Image)来提供读一致性. 可以查阅这篇文章得到更多信息" Oracle怎样管理数据的并发性和一致性".

                              -----------------------------------------------------------------------------
                             前映象  -- Before Image
                              对表进行insert,update,delete时候,另外一个session仍然可以从Orace回滚段或者
                             还原表空间中读取该表的前映象(before image), 所以Oracle同一时刻不同的session
                             有读不一致的现象。
                             -----------------------------------------------------------------------------

Oracle 提供1个全自动的机制, 被成为自动撤销管理(Automatic undo management),用来管理Undo的信息和空间. 在这中管理模式下,所有当前的sessions, 这个服务会自动管理undo 表空间内的undo segmentsspace.

自动撤销管理会消除管理 rollback segment空间的复杂度. 此外,对于用于满足长时间执行的查询可能用到的undo 信息.这个系统会为其自我调整来提供尽可能好的撤销周期(retention). 自动撤销管理被默认用户新安装的oracle数据库, 数据哭安装进程会自动创建1个undo 表空间.

oracle包含1个Undo 顾问, 会提供自动建立用户Undo 环境的帮助和建议.

这一节包含如下topics:

              * 手动撤销管理
              * Undo 限额 (undo Quata)
              * 自动 撤销周期 (Auto Undo Retenion)


4.4.1 手动撤销管理
1个数据库系统可以运行在手动撤销管理模式下. 在这个模式下,undo 空间通过roollback segments来管理, 而不会用到undo 表空间.

早期版本的oracle默认设定手动撤销管理模式. 若要改成自动撤销管理模式, 用户必须首先创建1个Undo 表空间,然后修改1个初始化参数. 如果你的oracle数据库版本是9i或者更后, 而你想将其改为自动撤销管理模式,请参阅

Oracle升级指南

                -----------------------------------------------------------------------------------
                注:
                rollback segment的空间管理相当复杂, Oracle强烈建议你使用自动撤销管理模式.
               ------------------------------------------------------------------------------------

4.4.2 Undo 限额 (undo Quata)
在自动撤销管理模式下, 系统会专门控制事务到 undo segments的分配, 还会控制 undo segments的空间分配. 1个出问题的事务可能会消耗相当打的 undo空间, 而导致整个系统瘫痪. 资源管理制定 UNOD_POOL 对大事务来说是1个更直观管理方式, 他会让 DBA对用用户进行分组,每一组都有不同的最大 undo 空间限制. 当1个用户组已经消耗的 undo空间已经到达上限, 这个组内的用户就不能做进一步的更新动作, 直到该组其他用户完成了部分事务而释放出占用的 Undo空间.

UNDO_POOL的默认值是 无限制 的, 所以用户默认被允许使用 undo 表空间内的所有 undo 空间. DBA 可以制定1个用户 UNDO_POOL设定限制.

4.4.3 自动撤销周期 (Auto Undo Retenion)
当一个事务被提交之后, 就不再需要 Undo数据去回滚或者修复事务了. 尽管这样, 为了一致性读的目的, 长时间执行的查询可能会用到就的 undo信息去制造 Data blocks的旧映像. 此外, 若干 Oracle闪回( oracle闪回技术介绍)特性是否成功, 也取决于旧 undo信息的可用性. 由于这些原因,  尽量保存旧的 undo信息就相当重要了. 如果其 undo 表空间还存有足够的空间被新事务使用,那么旧的 undo数据就可以被保留. 当可用空间变少, 数据库会开始覆盖那些被提交事务的 undo信息.

Oracle会为当前undo 表空间自动调整系统来提供尽可能好的撤销周期(retention), 数据库收集用户使用统计信息, 同时会根据这些信息和 Undo表空间的大小来调整 undo撤销周期. 如果该 undo 表空间 被设定为 AUTOEXTEND option(自动扩展)而没有设定最大 sizeundo retention 的调整会有些不同. 再这种情况下, 数据会调整自动撤销周期,使其略长于 最系统的最长查询时间所需, 如果空间允许的话...


终于翻译完了,真长啊 泪奔~














                    
                      

转载于:https://www.cnblogs.com/nvd11/archive/2013/04/02/2996844.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值