ITPub博客

首页 > 数据库 > Oracle > Oracle数据库逻辑结构VII

Oracle数据库逻辑结构VII

原创 Oracle 作者:糖糖TJ 时间:2015-07-22 20:58:49 0 删除 编辑

<!--[if !supportLists]-->一、<!--[endif]-->数据块

块是Oracle数据库执行输入/输出(I/O) 的最小单位,相应地,操作系统执行输入/输出(I/O) 的最小单位为一个操作系统块的大小。假定某用户执行“SELECT* FROM emp WHERE empno=7788”只会返回100Byte的数据,而数据块尺寸为2KB,那么Oracle会在数据文件上读取多少数据到数据高速缓存呢?因为Oracle数据库输入/输出的最小单位是块,所以一次读取的数据是一个数据块,即读取是2 KB的数据。

在Oracle9i之前,同一个数据库的所有表空间必须具有相同的数据块尺寸;而从Oracle9i开始,不同表空间可以具有不同的数据块尺寸。

<!--[if !supportLists]-->(一)、<!--[endif]-->多重数据块支持

Oracle9i 支持创建具有多种块大小的数据库。此功能在下列情况下非常有用:

<!--[if !supportLists]-->? <!--[endif]-->将表空间从联机事务处理(OLTP) 数据库传送到企业数据仓库时。使用Oracle9i,可方便地在具有不同块大小的数据库之间传送数据。

<!--[if !supportLists]-->? <!--[endif]-->要求能够在具有相应块大小的表空间中定位对象以最大限度地提高I/O 性能时。

使用Oracle9i,除了标准的块大小外,还可以指定最多四种非标准的块大小,如果想使用非标准大小的块,必须在初始化参数文件中,为每个非标准块大小配置子高速缓存。也可以在实例运行过程中配置子高速缓存,可以创建具有其中任意块大小的表空间。如果创建的表空间是非标准块大小,那么在建立表空间时使用BLOCKSIZE选项定义表空间所使用的非标准块尺寸。

<!--[if !supportLists]-->(一)、<!--[endif]-->标准块与非标准块大小

1.标准块大小

SYSTEM 表空间以及任何临时表空间中使用的块大小为标准块大小,除非进行指定,表空间的缺省块大小为标准块。数据块尺寸是由初始化参数DB_BLOCK_SIZE指明,其尺寸应该设置为操作系统(OS)块尺寸的整数倍,所以一个数据块由一个或多个操作系统块组,并且该参数的取值一般为2KB、4KB、8KB、16KB、32KB等。

通常,将DB_BLOCK_SIZE 设置为4 KB 8 KB。如果没有指定,则使用缺省数据块大小,缺省数据块大小取决于所用的操作系统,在创建数据库后将不能更改标准块大小,如果想更改标准块大小,只能重新创建数据库。使用DB_CACHE_SIZE 参数指定标准块大小缓冲区的高速缓存大小。DB_CACHE_SIZE最小值为一个粒组(granule),默认为48MB.粒组大小由SGA来决定,如果SGA<128MB,一个granule则是4MB,如果SGA>128MB,一个granule则是16MB。

2.非标准块大小

从Oracle 9i开始,除可以使用标准块大小外,还可以使用非标准块大小,取值范围是2KB、4KB、8KB、16KB、32KB。如果希望使用非标准块,必须在数据库缓冲区为数据库使用的各种块大小指定高速缓存大小。即如果要在数据库中使用多种块大小,则必须设置DB_CACHE_SIZE 和至少一个DB_nK_CACHE_SIZE 参数。每个参数为相应的块大小指定了缓冲区高速缓存大小。如下所示:

DB_2K_CACHE_SIZE2KB的块指定数据库高速缓存大小

DB_4K_CACHE_SIZE4KB的块指定数据库高速缓存大小

DB_8K_CACHE_SIZE8KB的块指定数据库高速缓存大小

DB_16K_CACHE_SIZE16KB的块指定数据库高速缓存大小

DB_32K_CACHE_SIZE32KB的块指定数据库高速缓存大小

如果nK是标准块大小,则不能指定的大小,DB_nK_CACHE_SIZE 参数的缺省值为零。如果存在块大小为nKB的联机表空间,则不要将此参数设置为零。最小可以设一个granule

<!--[if !supportLists]-->(二)、<!--[endif]-->创建非标准块表空间

可创建标准块大小的表空间,也可以创建非标准块大小表空间,使用BLOCKSIZE 子句为表空间指定非标准块大小,要指定该子句,必须设置DB_CACHE_SIZE 和至少一个DB_nK_CACHE_SIZE 参数,在该子句中指定的整数必须与某个DB_nK_CACHE_SIZE 参数中的n对应

【实例10-2】创建一个2K块大小的表空间mytbs2k,并验证。

1)以sys用户登录

CONN / AS SYSDBA

已连接

2)设置初始化参数DB_2K_CACHE_SIZE, 重新启动使参数设置生效

SQL> ALTER SYSTEM SET DB_2k_CACHE_SIZE=16M SCOPE=SPFILE;

系统已更改。

SQL> SHUTDOWN

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> STARTUP

ORACLE 例程已经启动。

Total System Global Area   47258064 bytes

Fixed Size                   453072 bytes

Variable Size              29360128 bytes

Database Buffers           16777216 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

3)创建表空间

CREATE TABLESPACE mytbs2k

DATAFILE 'd:\oracle\oradata\db01\mytbs2k_1.dbf' SIZE 10M

BLOCKSIZE 2K;

表空间已创建。

4)验证

SQL> SELECT tablespace_name,block_size

FROM dba_tablespaces

WHERE tablespace_name='MYTBS2K';

TABLESPACE_NAME                BLOCK_SIZE

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

MYTBS2K                              2048

执行上述命令后,创建名为mytbs2k的表空间,表空间中块的大小为2KB,查询DBA_TABLESPACES数据字典视图,可以看新建表空间的块大小为2K

多种块大小使用要注意:

<!--[if !supportLists]-->? <!--[endif]-->分区对象的所有分区必须位于具有相同块大小的表空间中。

<!--[if !supportLists]-->? <!--[endif]-->所有临时表空间必须采用标准块大小,包括用作缺省临时表空间的永久表空间。

<!--[if !supportLists]-->? <!--[endif]-->按索引组织的表溢出和外部LOB 段可以存储在块大小与基表不同的表空间中。

<!--[if !supportLists]-->(三)、<!--[endif]-->数据块的存储参数

当建立数据对象(表、索引、簇)时,通过指定合理的块空间使用参数可以提高块访问性能和并发性,使用参数可用来控制对数据段和索引段空间的使用。参数分为:控制并性的参数和控制空间使用的参数两类。

1.控制并发性的参数

INITRANS MAXTRANS:指定初始的和最大的事务槽(Transaction slot)数,这些事务槽在索引块或者数据块内创建。事务槽用来存储在某一时间点对块进行更改的事务处理的有关信息。一个事务只占用一个事务槽。

INITRANS:保证最低级别的并发性。对于数据段和索引段,INITRANS 的缺省值分别为2,以保证最低级别的并发性。例如,设置INITRANS的值为3,那么初始阶段可以有3个事务同时访问一个数据块。













如果需要,也可以从块空闲空间内分配更多事务槽,以允许更多的事务处理并发修改块内的行。


MAXTRANS:缺省值为255,它用于设置可更改数据块或者索引块的并发事务处理数的限制。例如MAXTRANS的值设为10时,访问同一数据块的事务数超过3之后,需要为新事务分配新的事务槽,并且最大并发事务个数为10



2.控制数据空间使用的参数

PCTFREE:对于数据段而言,此参数用于指定每个数据块中保留空间所占的百分比,当更新块内的行需要更多空间,就会使用保留空间。PCTFREE 的缺省值为10%

PCTUSED:对于数据段而言,此参数表示Oracle 服务器为表内每个数据块所保留的已用空间的最低百分比。如果一个块的已用空间低于PCTUSED,则将该块放回到空闲列表中。加入段的空闲列表的块可以用于重新插入数据。缺省情况下,每个段在创建时都有一个空闲列表。通过设置存储子句的FREELISTS 参数,可以创建有更多空闲列表的段。PCTUSED 的缺省值为40%

PCTFREE PCTUSED 都按可用数据空间百分比来计算,可用数据空间是从整个块大小减去块头空间后剩余的块空间。

<!--[if !supportLists]-->二、<!--[endif]-->段空间的管理

可以使用两种方法来管理数据块:

<!--[if !supportLists]-->? <!--[endif]-->自动段空间管理

<!--[if !supportLists]-->? <!--[endif]-->手动管理

<!--[if !supportLists]-->(一)、<!--[endif]-->手动数据块管理 

在以前的Oracle 版本中,这是唯一可用的方法。而且默认的块管理方式为手动管理。手动数据块管理允许手动配置数据块使用参数,例如:PCTFREE参数,PCTUSED参数,FREELIST参数。

下面过程介绍对于PCTFREE=20 PCTUSED=40 的数据段如何管理块内的空间(如图10-5所示): 

当向块中插入行时,块的空闲空间在减少,直到块内的空闲空间等于或者小于20%,此时行所占用的块内可用数据空间达到80% (100 – PCTFREE) 或者更多后,此后则无法在该块内插入数据。

剩余的20% 可在行大小增长时使用。例如,更新初始为NULL 的列并分配一个值。这样,更新后的块使用率可能超过80%

如果由于更新,删除了块内的行或者行大小减少,块使用率可能跌至80% 以下。但是,仍然无法向块中插入,直到块使用率跌至PCTUSED(在本例中为40% 以下,则该块可用于重新插入。

 

 













 

<!--[if !supportLists]-->(四)、<!--[endif]-->段空间自动管理

段空间管理方式可以采用自动段空间管理的方式,它是一种在数据库段内管理空闲空间的方法。自动段空间管理使用位图完成对段内空闲和已用空间的跟踪(与使用空闲列表相对)。位图段包含一个位图,它描述了与段中的可用空间相关的每个块的状态。该位图包含在单独的一组块中,这些块称为位图块,插入新行时,服务器就会在该位图中搜索是否具有足够空间的块,有则插入数据。当块中的可用空间数量发生变化时,位图中就会反映出它的新状态。使用自动段空间管理更方便、空间使用率更高,并且改进了并发INSERT 操作性能。但是不能用于包含LOB 的表空间。管理方便表现在PCTUSEDFREELISTSFREELIST GROUPS 均是自动管理的。所有对象都可以更有效地使用空间,尤其是行大小变化很大的对象。

 但要注意:

<!--[if !supportLists]-->? <!--[endif]-->自动段空间管理仅能在表空间级别启用,用于在本地管理的表空间。

<!--[if !supportLists]-->? <!--[endif]-->创建表空间后,这些配置将应用于在该表空间中创建的所有段。

自动段空间管理是通过CREATE TABLESPACE 命令的SEGMENT SPACE MANGEMENT AUTO子句指定的,此后不能更改这些段。如果定义了PCTUSEDFREELIST FREELISTGROUPS,则将其全部忽略。

因为自动段空间管理仅能在表空间级别启用,且只用于在本地管理的表空间,所以只需要创建本地管理的表空间进行指定即可。以下例子创建了一个自动段空间管理表空间。

【实例10-3】设置自动段空间管理

1)管理员方式登录

CONN /AS SYSDBA

2)创建表空间并设置自动段空间管理

SQL> CREATE TABLESPACE mytbs10

DATAFILE 'D:/oracle/oradata/db01/mytbs10.dbf' SIZE 5M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K

SEGMENT SPACE MANAGEMENT AUTO;

只要是创建在mytbs10表空间中所有段都是采用自动段空间管理。可以用位图管理的段为:表、索引、按索引组织的表(IOT) 以及LOB

<!--[if !supportLists]-->(五)、<!--[endif]-->查询存储信息

可以通过以下视图查询表空间、数据文件、段和空闲区与已用区之间的关系等信息:

DBA_EXTENTS

DBA_SEGMENTS

DBA_TABLESPACES

DBA_DATA_FILES

DBA_FREE_SPACE

【实例10-4】通过DBA_SEGMENTS 视图,查看段的区和块的数目。

1)以管理员方式登录

CONN / AS SYSDBA

已连接。

2)查询分配给EMP段的区和块的数目。

SQL> SELECT segment_name,extents,blocks,bytes

FROM dba_segments

WHERE owner = 'SCOTT' AND segment_name='EMP';

SEGMENT_NAME   EXTENTS     BLOCKS      BYTES

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

EMP                  1          8      65536

以上查询结果可以看出,SCOTT模式中EMP段,包含了一个区,总大小是8个数据块(65536Byte)。

【实例10-5】使用DBA_EXTENTS 视图。

1)以管理员方式登录

CONN / AS SYSDBA

2)检查给定段的区的信息

SQL> SELECT extent_id,file_id,block_id,blocks

FROM dba_extents

WHERE owner = 'SCOTT' AND segment_name='EMP';

EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS

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

         0          1      50465          8

 

该实例查询出EMP段包含的区号,文件号,块号和块数。

【实例10-6】使用DBA_FREE_SPACE 视图。

1)以管理员方式登录

CONN / AS SYSDBA

2)查询所有表空间的自由空间

SQL> SELECT tablespace_name, count(*),max(blocks), sum(blocks)

FROM dba_free_space

GROUP BY tablespace_name;

TABLESPACE_NAME                  COUNT(*) MAX(BLOCKS) SUM(BLOCKS)

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

CWMLITE                                 2        1328        1360

DRSYS                                   1        1320        1320

EXAMPLE                                 1          64          64

INDX                                    1        3192        3192

MYTBS10                                 1         632         632

ODM                                     1        1360        1360

SYSTEM                                  1         176         176

TOOLS                                   1         504         504

UNDOTBS1                                5       24552       25128

USERS                                   1        3192        3192

XDB                                     1          24          24

 

可见,SYSTEM表空间的可用空闲空间为176个数据块。

<!--[if !supportLists]-->三、<!--[endif]-->小结

Oracle为数据对象所分配的存储空间被称为段,段有多种类型,常见的是表段、还原段、索引段和临时段。存储空间的分配是以区为单位进行的,区由连续的数据块组成。通过指定pctfreepctused等参数,来控制其中块存储空间管理方式;通过指定initialnextpctincrease等存储参数,以指定其中区的分配方式。可以创建非标志块表空间,以满足不同的存储空间需求。

<!--EndFragment-->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29781254/viewspace-1744988/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-08-01

  • 博文量
    27
  • 访问量
    37360