您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 举例讲解Oracle表空间段区和块
举例讲解Oracle表空间、段、区和块Oracle逻辑存储结构分为空间、段、区、块四种。表空间、段、区和数据块分别表示了Oracle进行数据存储的不同层次和结构。本文首先讲解了对块、区、段、空间的理解,最后通过创建表空间h2,并在表空间h2上创建表regions,以及查询表空间、段、区,来进一步加深对表空间、段、区、块的认识。1、Oracle数据块(OracleDataBlock)数据块Block是Oracle数据信息的最小逻辑存储单元。注意,这里说的是Oracle环境下的最小单位。Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异。无论是Windows环境,还是Unix、Linux环境,其操作系统存储结构和方式、甚至字符排列的方式都是不同的。Oracle利用数据块将这些差异加以屏蔽,全部数据操作采用对Oracle块的操作,相当于是一个层次的抽象。Oracle所有对数据的操作和空间分配,实际上都是针对数据块Block的操作。我们从数据表中搜索出一行,实际中Oracle就会从内存缓冲区(或者硬盘)中读取到该行所在的数据块,再返回这数据块上的指定数据行。Oracle无论是在缓冲区,还是在硬盘,进行数据操作的最小单位都是数据块。数据块是有大小的,在一个数据库建立的时候,通过参数进行设置。注意,在Oracle数据库参数中,只有数据块大小的参数是建库之后不能进行修改的。数据块的大小,在一个数据库中可以支持多个。数据块的大小是通过kb字节个数来指定的,默认为8KB。相关参数为db_block_size,下面是查看block大小的语句。SQLshowparameterdb_block_size;NAMETYPEVALUE------------------------------------------------------------------db_block_sizeinteger8192设置数据块的大小是依据不同类型的系统的。如果数据块设置比较大,那么一次读取的数据行较多,相应对SGA内存消耗比较大,特定查询引发的换入换出可能较多。如果设置的过小,频繁的IO逻辑物理读也会引起性能问题。与数据块有关系的另一个参数就是db_file_multiblock_read_count,表示一次从物理存储中读取的数据块数量。对一些数据挖掘系统,可以考虑调节此参数略大一些。2、比block更高的一个单位,区extent。区extent,是比数据块大一级的存储结构,表示的是一连串连续的数据块集合。我们知道,物理存储通常是随机的读写过程。即使在同一个文件里,我们也不能保证相同的一个信息是存储在绝对连续的物理存储空间的。Oracle数据存储同样如此。在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表示一系列连续的数据块集合。视图dba_extents(或者all_extents、user_extents)是我们研究区结构的重要手段。SQLdescdba_extents;名称类型是否为空----------------------------------------------------------------OWNERVARCHAR2(30)SEGMENT_NAMEVARCHAR2(81)PARTITION_NAMEVARCHAR2(30)SEGMENT_TYPEVARCHAR2(18)TABLESPACE_NAMEVARCHAR2(30)EXTENT_IDNUMBERFILE_IDNUMBERBLOCK_IDNUMBERBYTESNUMBERBLOCKSNUMBERRELATIVE_FNONUMBER从视图结构中,我们可以清晰看出区的几个特点。首先,分区是带有段特定性的。数据段segment是区的上层组织单位,一个数据库对象对应一个segment,数据库对象是归属在不同的schema(owner)上的。所以,通过不同的数据段名称、不同的owner,乃至不同的tablespace表空间信息,就可以定位到数据区extent的信息描述。其次,另一部分信息是关于该区extent的分配信息,如所在文件编号,起始数据块block编号和数据块数量等内容。3、数据段segment数据段是与数据库对象相对应,一般一个数据库对象对应一个数据段。多个extent构成一个数据段,每个数据段实际上就是数据库一个对象的代表。从dba_segments视图中,可以看清数据段的结构。SQLdescdba_segments;名称类型是否为空说明----------------------------------------------------------------------------OWNERVARCHAR2(30)SEGMENT_NAMEVARCHAR2(81)PARTITION_NAMEVARCHAR2(30)SEGMENT_TYPEVARCHAR2(18)TABLESPACE_NAMEVARCHAR2(30)HEADER_FILENUMBERHEADER_BLOCKNUMBERBYTESNUMBERBLOCKSNUMBEREXTENTSNUMBERINITIAL_EXTENTNUMBERNEXT_EXTENTNUMBERMIN_EXTENTSNUMBERMAX_EXTENTSNUMBERPCT_INCREASENUMBERFREELISTSNUMBERFREELIST_GROUPSNUMBERRELATIVE_FNONUMBERBUFFER_POOLVARCHAR2(7)从类型列的说明信息中,可以看出数据段的类型是多样的。任何种类的数据库对象,本质上都是一种数据段。数据表、索引、回滚、聚集这些都是数据段的一种表现形式。同时,数据段是在数据对象创建的时候就已经创建出来,随着对象体积的增大,而不断分配多个extents进行管理。另外可看出该数据库对象分配的空间大小和数据块、分区个数。使用这个视图,可以方便的获取到指定schema的所有对象大小。SQLselectowner,sum(bytes)/1024/1024asvol,sum(blocks)astotalblocks,sum(extents)astotalextentsfromdba_segmentsgroupbyownerhavingowner='SYS';OWNERVOLTOTALBLOCKSTOTALEXTENTS-----------------------------------------------------SYS819.251048644151上面查询,说明SYS的schema,所占用空间819.25MB,包括104864个数据块和4151个分区。一个对象创建出来之后,在segment层次上是分配一个分区extent和八个数据块block。有一个问题需要注意,通常我们的数据段是与数据对象相关。一个数据对象对应一个segment。但是,分区表的时候,一个分区要对应一个segment对象。还有就是,segment对象是可以指定存储在那个表空间里,实现存储划分的基础也就在于此。不同的segment划分建立在不同的表空间里,才有可能存放在不同的文件中,最后分布在不同的物理存储。分区实际上就是存在分开存储的可能。一般一个对象是不会跨物理存储进行存放的,分区表是对应的多个segment。所以,分区表分开存储空间是可能的。4、表空间tablespace表空间TableSpace,是存储结构中的最高层结构。建立一个表空间的时候,需要指定存储的文件。一个表空间可以指定多个数据文件,多个文件可以在不同的物理存储上。也就是说,表空间是可以跨物理存储的。但是有一点就是,表空间下一级对象数据段的存储,是不能指定存储在那个文件里的。所以,要想让数据对象访问IO负载均衡,需要指定不同的数据对象在不同的表空间里。这也就是为什么将数据表和索引建立在不同的表空间的原因。表空间通过v$tablespace进行访问。SQLdescv$tablespace;名称类型是否为空------------------------------------------------------------TS#NUMBERNAMEVARCHAR2(30)INCLUDED_IN_DATABASE_BACKUPVARCHAR2(3)BIGFILEVARCHAR2(3)FLASHBACK_ONVARCHAR2(3)ENCRYPT_IN_BACKUPVARCHAR2(3)相对于前面的结构视图,表空间视图的结构要简单的多,只是一些描述信息。其中两个参数需要注意一下。一个是bigfile,是一个标志位,标志表空间是不是所谓的大文件表空间。大文件表空间是在10g中推出的一个新特性,处于性能考虑,可以设置表空间为大文件表空间,存储32T的数据,但是要求数据文件只能有一个。另一个是flashback_on,表示表空间的闪回特性是否开启。要注意,数据表段区块的概念集合,很容易与schema的结构相混淆。schema是一个组织概念,是来自于经典数据库理论范畴。在oracle中,Schema就是一个组织概念,一个user对应的就是一个schema。schema是逻辑对象的集合组织,同表空间等概念不是一个层面的。在一个schema里,是可以将对象建立在任何数据表空间内的,只有一个默认表空间的概念defaulttablespace。指定默认表空间是在创建用户的时候指定的。5、举例说明SQLcreatetablespaceh2datafile'd:\app\administrator\oradata\h2_1.dbf'size50m;SQLcreatetableregions(region_idnumberprimarykey,region_namevarchar2(25))TABLESPACEH2;SQLselect*fromv$tablespace;TS#NAMEINCBIGFLAENC---------------------------------------------0SYSTEMYESNOYES1SYSAUXYESNOYES2UNDOTBS1YESNOYES4USERSYESNOYES3TEMPNONOYES6EXAMPLEYESNOYES8H2YESNOYESSQLselect*fromdba_segmentswheretablespace_namelike'H2';OWNER-------------------SYSTEMSEGMENT_NAME------------------------REGIONSSEGMENT_TYPESEGMENT_SUbtype-----------------------------------------------------TABLEASSMTABLESPACE_NAMEHEADER_FILEHEADER_BLOCKBYTESBLOCKS-------------------------------------------------------------------------H27130655368EXTENTSINITIAL_EXTENTNEXT_EXTENTMIN_EXTENTSMAX_EXTENTSMAX_SIZE----------------------------------------------------------------------------------------------------------------1655361048576121474836452147483645RELATIVE_FNOBUFFER_FLASH_C-------------------------------------------7DEFAULTOWNER--------
本文标题:举例讲解Oracle表空间段区和块
链接地址:https://www.777doc.com/doc-2730428 .html