论坛风格切换
您好,欢迎光临本站!   登录 注册新用户
  • 4199阅读
  • 1回复

[oracle]存储空间管理 [复制链接]

上一主题 下一主题
 
发帖
34
黑豆
6
威望
138
贡献值
0
交易币
0
红豆
0
只看楼主 倒序阅读 0 发表于: 2016-06-28



在数据库的逻辑结构中,表空间将不同类型的数据分别组织在一起,如系统数据、用户数据、临时数据、回滚数据等。
在同一个表空间中,数据以数据库对象为单位组织在一起,一般情况下一个数据库对象对应一个段,一个表空间中包含多个段。
在段中存储数据库对象中的数据,数据所占用的存储空间以区为单位进行分配和回收。

一个数据库对象占用若干个区,所以段是由若干个区组成的。
当为数据库对象分配存储空间时,一次分配一个或多个区。
区是分配和回收存储空间的基本单位,一个区是由若干个连续的数据块组成的。
数据块是逻辑结构中的最小存储单位,是Oracle读写数据的基本单位。

当用户访问数据时,服务器进程首先将数据从数据块读到数据库高速缓存中,并存储在与数据块大小相同的缓冲区中,然后在缓冲区中对数据进行读写。
数据库中的数据在物理上是存储在磁盘上的,需要占用一定的操作系统块。

一个数据块是由若干个操作系统块组成的,因此,数据块的大小是操作系统块的整数倍。
数据库服务器对数据块的读写最终将转化为对多个操作系统块的读写。

段的管理
在表空间中,一个段一般代表一个数据库对象,对象的所有数据都存储在对应的段中。
一般情况下段不需要用户自己创建,在创建数据库对象将自动产生段。
为段所分配的空间就位于表空间的数据文件中,这些存储空间由若干个区组成。
段、区和数据块之间的关系如图所示。


段的类型
Oracle 11g支持10余种类型的段。
通过查询数据字典dba_segments ,可以得到当前数据库中已经存在的段类型。
下面是有关数据字典dba_segments的相关信息:
DBA_SEGMENTS describes the storage allocated for all segments in the database.
Related View
USER_SEGMENTS describes the storage allocated for the segments owned by the current user's objects. This view does not display the OWNER, HEADER_FILE, HEADER_BLOCK, or RELATIVE_FNO columns.
ColumnDatatypeNULLDescription
OWNERVARCHAR2(128) Username of the segment owner
SEGMENT_NAMEVARCHAR2(128) Name, if any, of the segment
PARTITION_NAMEVARCHAR2(128) Object Partition Name (Set to NULL for nonpartitioned objects)
SEGMENT_TYPEVARCHAR2(18) Type of segment:
  • NESTED TABLE
  • TABLE
  • TABLE PARTITION
  • CLUSTER
  • LOBINDEX
  • INDEX
  • INDEX PARTITION
  • LOBSEGMENT
  • TABLE SUBPARTITION
  • INDEX SUBPARTITION
  • LOB PARTITION
  • LOB SUBPARTITION
  • ROLLBACK
  • TYPE2 UNDO
  • DEFERRED ROLLBACK
  • TEMPORARY
  • CACHE
  • SPACE HEADER
  • UNDEFINED
SEGMENT_SUBTYPEVARCHAR2(10) Subtype of LOB segment: SECUREFILE, ASSM, MSSM, andNULL
TABLESPACE_NAMEVARCHAR2(30) Name of the tablespace containing the segment
HEADER_FILENUMBER ID of the file containing the segment header
HEADER_BLOCKNUMBER ID of the block containing the segment header
BYTESNUMBER Size, in bytes, of the segment
BLOCKSNUMBER Size, in Oracle blocks, of the segment
EXTENTSNUMBER Number of extents allocated to the segment
INITIAL_EXTENTNUMBER Size in bytes requested for the initial extent of the segment at create time. (Oracle rounds the extent size to multiples of 5 blocks if the requested size is greater than 5 blocks.)
NEXT_EXTENTNUMBER Size in bytes of the next extent to be allocated to the segment
MIN_EXTENTSNUMBER Minimum number of extents allowed in the segment
MAX_EXTENTSNUMBER Maximum number of extents allowed in the segment
MAX_SIZENUMBER Maximum number of blocks allowed in the segment
RETENTIONVARCHAR2(7) Retention option for SECUREFILE segment
MINRETENTIONNUMBER Minimum retention duration for SECUREFILE segment
PCT_INCREASENUMBER Percent by which to increase the size of the next extent to be allocated
FREELISTSNUMBER Number of process freelists allocated to this segment
FREELIST_GROUPSNUMBER Number of freelist groups allocated to this segment
RELATIVE_FNONUMBER Relative file number of the segment header
BUFFER_POOLVARCHAR2(7) Buffer pool to be used for segment blocks:
  • DEFAULT
  • KEEP
  • RECYCLE
FLASH_CACHEVARCHAR2(7) Database Smart Flash Cache hint to be used for segment blocks:
  • DEFAULT
  • KEEP
  • NONE
Solaris and Oracle Linux functionality only.
CELL_FLASH_CACHEVARCHAR2(7) Cell flash cache hint to be used for segment blocks:
  • DEFAULT
  • KEEP
  • NONE
See Also: Oracle Exadata Storage Server Software documentation for more information
INMEMORYVARCHAR2(8) Indicates whether the In-Memory Column Store (IM column store) is enabled (ENABLED) or disabled (DISABLED) for this segment
INMEMORY_PRIORITY1VARCHAR2(8) Indicates the priority for In-Memory Column Store (IM column store) population:
  • LOW
  • MEDIUM
  • HIGH
  • CRITICAL
  • NONE
  • NULL
INMEMORY_DISTRIBUTE1VARCHAR2(15) Indicates how the IM column store is distributed in an Oracle Real Application Clusters (Oracle RAC) environment:
  • AUTO
  • BY ROWID RANGE
  • BY PARTITION
  • BY SUBPARTITION
INMEMORY_DUPLICATE1VARCHAR2(13) Indicates the duplicate setting for the IM column store in an Oracle RAC environment:
  • NO DUPLICATE
  • DUPLICATE
  • DUPLICATE ALL
INMEMORY_COMPRESSION1VARCHAR2(17) Indicates the compression level for the IM column store:
  • NO MEMCOMPRESS
  • FOR DML
  • FOR QUERY [ LOW | HIGH ]
  • FOR CAPACITY [ LOW | HIGH ]
  • NULL

例如:
SELECT DISTINCT segment_type FROM dba_segments;
1.表段(TABLE)
表段是用来存储表中的数据的,这是最常见的一种段。
在创建表时将自动创建一个同名的段,表中的数据就存储在数据段中。
2.索引段(INDEX)
索引是依赖于表的数据库对象,它的功能是加快表的查询速度。
当用户执行CREATEINDEX命令创建索引时,在数据库中将产生一个索引段。
当用户在表上定义主键约束和唯一性约束时也将自动产生索引段。
索引段的名称与索引相同,索引中的数据就存储在索引段中。

3.临时段
当用户执行排序等操作时,将产生大量的临时数据。
临时数据将首先存储在PGA的排序区中,如果排序区的大小不足以存放这些临时数据时,将使用临时段。
一般情况下,用户在执行以下操作时可能用到临时段:

SELECT ••• FROM ••• ORDER BY •••
SELECT ••• FROM ••• GROUP BY •••
SELECT DISTINCT ••• FROM •••
SELECT ••• UNION
CREATE INDEX •••
ANALYZE

临时段一般位于专门的临时表空间中。
如果没有专门的临时表空间,数据库服务器将把SYSTEM表空间作为用户的临时表空间。
临时段不是一种永久性的段,而是随着用户的排序操作的进行而动态产生和消失的。
当排序操作开始时,在临时表空间中将产生一个临时段,在排序结束时临时段将被删除。
如果在SYSTEM表空间中存储这些临时数据,将导致大量的存储碎片的产生,从而大大降低数据库服务器的性能。
因此, Oracle建议创建专门的临时表空间。

4.回滚段(ROLLBACK)
回滚段是用来存储回滚数据的。
如果使用自动方式管理回滚数据,需要在数据库中创建一个UNDO表空间,随着用户事务的执行,在UNDO表空间中将自动产生回滚段。
5.分区表段(TABLE PARTITION)
在数据库中可以将一个大表分成几个分区( PARTITION ),每个分区对应一个段。
这些分区表段可以存储在同一个表空间中,也可以存储在不同的表空间中
分区表主要应用于数据仓库,它的主要作用是缩小数据库查询的范围,加快查询的速度
例如,某公司的客户表中存储了上万条客户信息,假设将这个表分成13个区,将客户信息按照其姓名的首字母不同而分别存储在不同的分区中。
姓名以“A”和“B ”开始的客户存储在第一个分区中,以“C”和“D”开始的存储在第二个区中,依此类推。
这样一个表中的数据就被分开存储在13 个分区中,如果要查询一个客户的信息,只需要在它所在的分区中查询即可,查询的范围将大约缩小为原来的1/13 。

6.分区索引段(INDEX PARTITION)
与表的分区类似,索引也可以分区。
将一个索引划分为几个分区,每个分区对应一个段,索引的数据将分别存储在这些段中
对索引进行分区的目的是为了加快查询索引的速度。

需要注意的是,只有对表进行分区后,才能在表上创建分区索引。
7.LOB段
如果在表中定义了CLOB 或BLOB 类型的列,在表中就可以存储大文本或二进制数据,如文档、图像、声音等。
LOB数据并不是直接存储在表段中,而是单独存放在一个LOB 段中,在表中仅仅存放LOB 段的指针。

8.LOB索引段
如果在表上定义了LOB 类型的列,在数据库中将自动创建LOB 段,同时自动创建LOB索引段。
LOB索引段的作用是加快LOB 列的查询速度。

9.簇段(CLUSTER)
簇是一种数据库对象,它的作用是将逻辑上相关的数据组织在一起,簇中的数据来自一个或多个表。
每个簇对应一个簇段,在创建簇时将自动创建簇段,并且簇段的名称与簇完全相同。
使用簇可以加快多表查询的速度

10.索引组织表(INDEX ORGANIZED TABLE)段
如果经常要根据一个表的主键查询数据,可以将主键列上的索引与表放在一个段中,这种表称为索引组织表,它被存储在一个表段中,这种表段就是索引组织表段。
索引组织表段的主要作用是加快基于主键的查询速度。
假设在数据库中创建一个表,在表上创建一个索引,在表中包含一个LOB列,那么创建表的结果是产生了四个段:表段、索引段、LOB段和LOB索引段。
图表示这四个段之间的关系。


段空间的管理
一般来说,段不需要用户专门创建,当用户创建一个数据库对象时,在数据库中将自动产生对应的段。
临时段和回滚段比较特殊,临时段位于临时表空间中,它是随着用户的排序等操作的进行而动态创建和消失的。
回滚段位于UNDO表空间中,并且随着用户事务的执行而动态产生和消失。
在本地管理表空间中,区的分配策略有自动方式和手工方式两种。

如果采用自动方式(AUTOALLOCATE ),数据库服务器将决定区的大小,并自动进行区的分配和回收,区的大小是可变的,默认的区大小为64KB 。
如果采用手工方式,则需要通过UNIFORM 指定区的大小,默认为1MB
在创建本地管理表空间时,还可以使用SEGMENT SPACE MANAGEMENT子句指定段空间的管理方式。
如果采用手工方式,则表空间将为每个段维护一个空闲列表( Free List ),它位于数据文件的头部,在空闲列表中记录当前数据文件中所有的空闲块,段利用空闲列表管理块的分配和回收。
如果选择自动方式,段将采用位图的方式管理块的分配和回收。

为了对段中数据块的使用进行控制,在段中设置了一个HWM (High Water Mark )。
HWM可以认为是一个指针,在段刚被创建时, HWM位于段的开始位置

在HWM之上是没有被格式化,尚不能写入数据的数据块,而在HWM之下的数据块有以下几种情况:
·已经包含数据
·以前曾经包含数据,但后来数据被删除。
·已经被格式化,且状态为空闲的。
·尚未被格式化。

为了给用户数据分配数据块,在段中还设置了一个低HWM位于低HWM之下的数据块要么是已经包含数据的,要么是曾经包含数据,但后来数据被删除的
对一个用户事务而言,可用的数据块就是那些位于低HWM 和HWM之间的数据块。
当用户向段中写入数据时,服务器进程将在低HWM 和HWM之间查找那些已经被格式化的数据块,将数据写入这些数据块。
如果没有足够的数据块可用,服务器进程将在这个范围内查找那些尚未被格式化的数据块,对其进行格式化,然后将数据写入。
如果这样的数据块还不能满足要求,服务器进程将把HWM 向上移动,为这次事务分配其他尚未格式化的数据块,然后对其进行格式化,并将数据写入。

在将数据写入数据块之后,服务器进程将把低HWM 向上移动,使其指向第一个可用的数据块。
数据块的分配情况如图所示。


区的管理
区是Oracle 为数据库对象分配存储空间的基本单位。
当用户创建表、索引、簇等数据库对象时,数据库服务器将为该对象对应的段分配若干个区,以存储该对象的数据。
当段的空间被消耗完时,可以进行扩展,数据库服务器将为该段分配新的区。
当一个数据库对象被删除时,它所占用的区将被释放,数据库服务器负责回收这些区,并在适当的时机将这些空闲区分配给其他数据库对象。

区的分配
在本地管理表空间中,区的大小要么由数据库服务器自动指定,要么由数据库管理员指定。
当在表空间中创建表、索引等数据库对象时,数据库服务器将按照指定的大小为段分配相应数量的区,在默认情况只分配一个初始区,尽管在这个区中还没有包含数据,但这个区不能分配给其他数据库对象。
当初始区被写满后,数据库服务器将根据需要为段分配其他的区。
在表空间的每个数据文件的头部,都有一个位图,用来控制块的分配

当为段分配一个区时,数据库服务器将在位图中查找可用的数据块,将它们分配这个区。
首先我们执行下面的语句来创建本地管理表空间ts4:

CREATE TABLESPACE TS4 DATAFILE 'C:\Users\john\Desktop\tbs\ts4_1.dbf' SIZE 1M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

由于采用了自动分配方式( AUTOALLOCATE ),因此在表空间ts4 中所有区的大小默认都是64KB 。
接下来我们在表空间ts4 中创建表tab3:

CREATE TABLE tab3 (col INT) TABLESPACE ts4;
这样将为段TAB3分配一个区,大小为64KB ,占用8个数据块(每个数据块大小为8KB )。
执行下面的查询语句,将得到为段TAB3 分配得区的信息:

SELECT bytes, blocks, extents FROM dba_segments WHERE segment_name='TAB3';
一个段所占用的区的详细信息可以通过查询数据字典DBA_EXTENTS获得。
下面是有关数据字典DBA_EXTENTS的信息。
DBA_EXTENTS describes the extents comprising(构成) the segments in all tablespaces in the database.
Note that if a data file (or entire tablespace) is offline in a locally managed tablespace, you will not see any extent information. If an object has extents in an online file of the tablespace, you will see extent information about the offline data file. However, if the object is entirely in the offline file, a query of this view will not return any records.
Related View
USER_EXTENTS describes the extents comprising the segments owned by the current user's objects. This view does not display the OWNER,FILE_ID, BLOCK_ID, or RELATIVE_FNO columns.
ColumnDatatypeNULLDescription
OWNERVARCHAR2(128) Owner of the segment associated with the extent
SEGMENT_NAMEVARCHAR2(128) Name of the segment associated with the extent
PARTITION_NAMEVARCHAR2(128) Object Partition Name (Set to NULL for nonpartitioned objects)
SEGMENT_TYPEVARCHAR2(18) Type of the segment: INDEX PARTITION, TABLE PARTITION
TABLESPACE_NAMEVARCHAR2(30) Name of the tablespace containing the extent
EXTENT_IDNUMBER Extent number in the segment
FILE_IDNUMBER File identifier number of the file containing the extent
BLOCK_IDNUMBER Starting block number of the extent
BYTESNUMBER Size of the extent in bytes
BLOCKSNUMBER Size of the extent in Oracle blocks
RELATIVE_FNONUMBER Relative file number of the first extent block

例如,下面的SELECT语句用于查询段TAB3所占用的区的ID 、大小、区中所包含数据块的数目以及第一个数据块的ID:
SELECT extent_id, bytes/1024 ||'K' KBytes, blocks, block_id FROM dba_extents WHERE segment_name='TAB3';
区的回收
在一般情况下,从段中删除数据时,数据所占用的空间并没有被释放,除非这个数据库对象被删除。
在以下几种情况中,会发生区的回收:
·一个对象被删除。
.对表进行整理。
·对索引进行重建或合并。
·在表上执行TRUNCATE命令。
·手工执行命令释放段中HWM以下未使用的空间。
在这里需要注意的是, TRUNCATE命令的执行结果是将表中的数据删除,从表面上来看类似于DELETE ,但是这两条命令有很大的区别。
在执行TRUNCATE命令时,表段中的HWM被移动到段的开始位置,这就意味着下次写数据是从段的开始位置进行的,以前的数据所占用的空间被释放。
而在执行DELETE命令时, HWM并没有移动,这就意味着数据虽然被删除了,但是数据所占用的空间并没有被释放。

数据块的管理
数据块是Oracle 中最小的存储单位,也是数据库服务器读写数据的基本单位。
用户在访问数据库时,服务器进程首先将数据从数据块中读到SGA的数据库高速缓存中,并放在与数据块大小相同的缓冲区中,然后在缓冲区中对数据进行读写
如果数据发生了变化, DBWR后台进程负责将脏缓冲区中的数据重新写人数据块。
在Oracle 11g 的数据库中可以定义标准块,也可以定义非标准块。

标准块的大小由初始化参数DB_BLOCK_SIZE指定。
非标准块的大小可以是2KB 、4KB 、16KB 、32KB等,只要不与标准块的大小相同即可。
无论是哪种块,在SGA 中都需要为其定义数据库高速缓存,缓存是由许多缓冲区组成,缓冲区大小与数据块相同。
当用户访问数据块中的数据时,服务器进程将把数据从数据块读到相应的缓冲区中。
为了提高数据库的性能, Oracle规定数据块的大小必须是操作系统块的整数倍。

例如,在
Windows系统中,操作系统块的大小是4KB ,所以数据块的大小可以是4KB 、8KB 、16KB 等。
在UNIX 中,操作系统块的大小是512 字节或1KB ,所以数据块的大小可以是1KB 、2KB 、4KB 等。

数据块的组成
在数据块中可以存储不同类型的数据,如用户数据、系统数据、表、索引等。
无论是什么类型的数据,最终都是存储在数据块中的,这些数据块具有相同的结构
一个数据块由以下几部分组成:
·块头:用来记录块本身的信息,如块地址、段类型等。
·表目录:如果在数据块中存储表中的数据,则需要把表的相关信息记录在表目录中。
·行目录:如果在数据块中存储表中的数据,还需要把这些行的信息记录在行目录中。

·空闲空间:是指数据块中尚未使用的存储空间。
当向表中插入数据时,将使空闲空间减少。
当删除表中的数据时,将使空闲空间增加。

而当执行UPDATE操作时,可能使空闲空间增加,也可能使其减少。
·已使用空间:是指数据块中己写入数据的空间。

数据库对象的数据就存储在数据块的已使用空间中。
在数据块中,块头、表目录和行目录中的信息只能由数据库服务器来维护,用户的操作只能直接影响空闲空间和已使用空间。

数据块的空间管理
数据块的空间管理主要涉及空闲空间的管理。
当数据库服务器为数据库对象分配存储空间时,以区为单位分配几个连续的数据块,数据库对象的数据就存储在这些数据块中。
当区中的一个数据块被写完时,数据将继续写入下一个数据块。
当区中所有数据块都被写完时,数据将被写入下一个区。
这里以表为例来说明数据块空间的管理。

当用户在表上执行INSERT操作时,新数据被写入数据块的空闲空间。
当用户执行DELETE操作时,数据块中相应的数据将被删除。

为了提高数据库的性能,在每个数据块中都需要保留一定的空间,这段空间是为执行UPDATE操作而保留的。
当用户执行UPDATE操作时,修改后的数据可能占用比原来更多的存储空间。

例如,假设员工SMITH原来的奖金( COMM )为NULL ,因为NULL是不占用存储空间的,所以当执行语句“ UPDATE emp SET comm=5000 WHERE ename =’ SMITH’时,该行数据将需要更多的存储空间。
如果在当前块中没有预留空间,那么这行数据将被分开存储在两个块中,于是产生了块间的迁移
块间的迁移将降低数据库的性能,因为如果用户要访问这一行数据时,将不得不从两个数据块中读取数据,这样就增加了磁盘I/O 。
如果在数据块中设置了保留空间,那么可能会出现这种情况:当用户执行UPDATE语句修改一行数据时,这行数据可能会占用比以前更多的空间,这时就可以使用保留空间,这样就减少了数据块之间的迁移。
当然保留空间也可能无法满足UPDATE操作的需要,于是一行数据还是要被分开存储在两个数据块中,在这种情况下也将产生数据块间的迁移,只不过产生迁移现
象的现象将大大减少。

如果表空间的区管理方式为本地管理,并且在创建表空间时使用SEGMENT SPACEMANAGEMENT子句指定段空间管理方式为AUTO ,那么表空间将为每个段维护一个位图,并以位图的方式管理段中的数据块,这种管理是自动进行的,不需要人为干预。
在其他情况下,表空间为每个段指定一个空闲列表,并以空闲列表的方式管理段中的数据块。
在后一种情况下用户可以通过PCTFREE和PCT USED两个参数控制数据块空间的使用。
PCTFREE和PCTUSED两个参数是用在数据库对象上的。

在创建表、索引等数据库对象时,可以指定这两个参数,也可以在创建数据库对象之后修改这两个参数
1.PCTFREE参数
PCTFREE参数用于设置数据块中必须保留的最少空间,参数值是-个百分比,保留的空间是为UPDATE操作使用的。
当用户执行UPDATE操作时,修改后的数据可能需要比原来更多的存储空间(当然也可能比原来更少),如果没有保留空间,修改后的数据将不得不因为空间不
足而另外使用一个数据块,这样一行数据将存存储在两个数据块中,这种现象称为数据块间的迁移
当用户下次再访问这行数据时,将不得不从两个数据块中取出所需的数据,这样就增加了磁盘的I/O,从而降低了数据库的性能。
假设PCTFREE参数的值设置为20 ,那么在数据块中将有20%的保留空间,其余的80% 的空间可用来存储数据。
随着数据库服务器的运行,当80% 的空间被消耗完时,新的数据将无法再写入这个块,于是需要使用一个新的数据块来存储数据。
20%的保留空间是用于UPDATE操作的,如果用户一直没有执行UPDATE操作,或者经过UPDATE操作后数据需要的存储空间比原来反而更少,这部分空间将一直保持空闲。
PCTFREE参数的用法如图所示。


PCTFREE参数的值可以设置在0 ~ 99之间。

如果参数的值较大,那么发生数据块间迁移的机会将减少,数据库的性能比较高,但是数据块空间的浪费比较严重。
如果将参数值设置得较小,数据块存储空间的利用率较高,但是发生数据块间迁移的机会将增加,数据库的性能将受到较大影响。

2.PCTUSED参数
PCTUSED参数用于设置可再次向数据块中写人数据时,已使用空间的百分比
如果将PCTFREE参数的值设置为20 ,那么最多可以使用数据块80%的存储空间。
当可用空间被消艳完时,用户将无法继续向这个块中插入数据。
当用户执行DELETE操作删除数据时,将使已使用空间减少,空闲空间增加。
执行UPDATE操作也可能使已使用空间减少。

随着已使用空间的不断减少,用户可再次写入数据,但是必须满足一定的条件,即已使用空间必须减少到PCTUSED参数指定的百分比。
如果将PCTUSED参数值设置为60 ,那么当数据块中已使用空间减少到60%时,用户才可以再次向这个数据块中插入数据。
PCTUSED参数的用法如图所示。


一般情况下PCTFREE和PCTUSED两个参数配合使用,共同控制数据块存储空间的使用。
下图显示了PCTFREE和PCTUSED两个参数分别设置为20和60时的情况。



如果一个段位于本地管理表空间中,并且段空间管理方式为MANUAL ,或者位于字典管理表空间中,表空间将为每个段维护一个空闲列表
在空闲列表中记录所有完全空闲的数据块,或者已经使用的,但是可以继续写入数据的数据块。
如果一个数据块中的空闲空间一直减少,当达到PCTFREE参数指定的数值时,这个数据块将被从空闲列表中删除。
在这两种类型的表空间中,我们可以通过PCTFREE和PCTUSED参数控制数据块存储空间的使用。
例如,以下语句用于创建表tab5,并为段tab5指定PCTFREE和PCTUSED参数:

CREATE TABLE tab5(col int) PCTFREE 20 PCTUSED 60;


更多Oracle精彩内容 请关注我:
http://www.wyzc.com/Course/Course/showAction/id/13765?tg=ZrHfnouF=




快速回复
限100 字节
 
上一个 下一个