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 描述了它们之间的关系
作为最小存储单元, 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)的表空间中,有两个空间管理参数, PCTFREEPCTUSED,允许用户通过这两个参数在某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的作用:

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的限制)。

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

图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 tableDrop 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语句的数据. 当事务或会话结束后oracle会drop那个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的操作
下列语句有时会需要用到Temporary 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_tablespacesCONTENTS列中.
                            ---------------------------------------------------------------------

如果没有为用户指定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 表空间和临时表空间

当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 的调整会有些不同. 再这种情况下, 数据会调整自动撤销周期,使其略长于 最系统的最长查询时间所需, 如果空间允许的话...

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


翻译: Oralce官方文档-- Data Blocks, Extents, and Segments相关推荐

  1. 翻译Houdini官方文档:PDG教程之HDA处理器

    官方文档:PDG Tutorial 3 HDA Processor Part 1 关于这个教程 你将会学到什么 步骤 0 - 拷贝所需的HDA文件 步骤 1 - 观察HDA 步骤 2 - 设置PDG输 ...

  2. (原) Data Blocks, Extents, and Segments

    Data Blocks, Extents, and Segments     Data Blocks 是最小的单元,由DB_BLOCK_SIZE 参数决定.包括Common and Variable ...

  3. 翻译HoudiniEngine官方文档:PDG

    官方文档:<Houdini Engine 3.6: PDG> 介绍 PDG 是一套用于对任务进行分配与管理的程序化架构. 使用 Houdini Engine,PDG的功能可以轻松地在其他应 ...

  4. 翻译Houdini官方文档:PDG/TOPs介绍

    官方文档:Introduction to TOPs 总览 使用TOPs工作 TOP节点UI Processors(处理器) Mappers partitions(分割) Schedulers(调度器) ...

  5. [翻译]ElasticSearch官方文档-安装

    本文翻译自:www.elastic.co/guide/en/el- 本文是Elasticsearch的入门文档,将会介绍ElasticSearch在不同环境下的安装. 安装 Elasticsearch ...

  6. [翻译]ElasticSearch官方文档-执行查询和过滤操作

    本文翻译自:www.elastic.co/guide/en/el- 本文是Elasticsearch的入门文档,将会介绍ElasticSearch中的查询操作和过滤操作. 执行查询 现在我们已经看到了 ...

  7. 【翻译一下官方文档】邂逅uniCloud云函数(基础篇)

    我将用图文的形式,把市面上优质的课程加以自己的理解,详细的把:创建一个uniCloud的应用,其中的每一步记录出来,方便大家写项目中,做到哪一步不会了,可以轻松翻看文章进行查阅.(此文长期更新连载) ...

  8. 用Lombok项目减少样板代码(翻译自官方文档)

    介绍 安装 Lombok注释 @Getter and @Setter @NonNull @ToString @EqualsAndHashCode @Data @Cleanup @Synchronize ...

  9. Maven介绍(翻译自官方文档)

    1. Introduction(简介) Maven, a Yiddish word meaning accumulator of knowledge, was originally started a ...

最新文章

  1. ubuntu12.0.4不能正常关机和重启的解决方法
  2. Python Sphinx使用踩坑记录
  3. C++有用的字符函数库
  4. Android的内容观察者
  5. java 向文件写数据_java向文件写数据的3种方式
  6. docker---dockerfile 编写优化
  7. 通过一道CTF题,学习pillow模块切割、合并图片
  8. 隐私政策说明 - 掌上软考答题速记系统
  9. PostgreSQL查询 动态输入参数
  10. 一位软件测试工程师的5年成长经历,这些职场黑话,你需要知道
  11. 【开源项目】小程序版 玩安卓
  12. windows 2003 远程桌面没有声音解决方法
  13. 《沉思录卷八》灵魂先于肉体屈服是可耻的
  14. 基于模板匹配和遗传算法的人眼定位
  15. java调用授权接口oauth2_微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
  16. 票据二维码中信息获取处理与分析系统 毕业设计
  17. Virtuoso版图工具栏上没有PDK按钮,Calibre验证DRC时没有Customization选项
  18. mysql离散查询_mySQL数据库数据查询操作详解
  19. 看完跳槽少说涨 5 K,前端面试从准备到谈薪完全指南(全是精华)
  20. android web_适用于Android的最佳Web浏览器

热门文章

  1. [register]-ARMV8-aarch64的通用寄存器介绍和总结
  2. [ARM异常]-ARMV8-aarch64 异常(中断)是如何跳转到向量表的
  3. [gic]-ARM gicv2和gicv3的中断模型总结
  4. win32 实现死锁的小例子
  5. 线性筛素数(欧拉筛)
  6. WriteFile和GetSystemDirectory
  7. 【安全】免密登陆SQLSERVER 之 Token 窃取
  8. c# 5.0入门经典笔记
  9. Ubuntu 环境中多线程下载工具Axel的安装与使用
  10. 【NGINX+PHP7.3+MYSQL】安装指南