模式对象的空间管理关系到空间的有效使用和数据的合理分布,本章介绍了模式对象相关的存储参数、多余空间的回收机制、模式对象上的空间限制、如何查看已使用的存储空间以及各种数据类型实际使用的空间大小。
8.1 设置存储参数
8.1.1 普通表和索引
对于普通表和索引,DM8 提供了以下的存储参数:
- 初始簇数目 INITIAL:指建立表时分配的簇个数,必须为整数,最小值为 1,最大值为 256,缺省为 1;
- 下次分配簇数目 NEXT:指当表空间不够时,从数据文件中分配的簇个数,必须为整数,最小值为 1,最大值为 256,缺省为 1;
- 最小保留簇数目 MINEXTENTS:当删除表中的记录后,如果表使用的簇数目小于这个值,就不再释放表空间,必须为整数,最小值为 1,最大值为 256,缺省为 1;
- 填充比例 FILLFACTOR:指定插入数据时数据页的充满程度,取值范围从 0 到 100。默认值为 0,等价于 100,表示全满填充,未充满的空间可供页内的数据更新时使用。插入数据时填充比例的值越低,可由新数据使用的空间就越多;更新数据时填充比例的值越大,更新导致出现的页分裂的几率越大;
- 表空间名:在指定的表空间上建表或索引,表空间必须已存在,默认为用户缺省的表空间。
例 表 PERSON 建立在表空间 TS_PERSON 中,初始簇大小为 5,最小保留簇数目为 5,下次分配簇数目为 2,填充比例为 85。
CREATE TABLE PERSON.PERSON
( PERSONID INT IDENTITY(1,1) CLUSTER PRIMARY KEY,
SEX CHAR(1) NOT NULL,
NAME VARCHAR(50) NOT NULL,
EMAIL VARCHAR(50),
PHONE VARCHAR(25))
STORAGE
( INITIAL 5, MINEXTENTS 5,
NEXT 2, ON TS_PERSON, FILLFACTOR 85);
也可以在分区表上指定某个分区的存储参数,如下面的建表语句指定了 PAR2 分区存储在 TS_PAR2 表空间上。
CREATE TABLE PARTITION_TABLE
(C1 INT,
C2 INT)
PARTITION BY RANGE(C1)
(PARTITION PAR1 VALUES LESS THAN(5),
PARTITION PAR2 VALUES LESS THAN(100) STORAGE (ON TS_PAR2));
8.1.2 堆表
对于堆表可以指定并发分支 BRANCH 和非并发分支 NOBRANCH 的数目,其范围是 (1=<BRANCH <= 64,1<=NOBRANCH<=64),堆表最多支持 128 个链表。
例 下例创建的 LIST_TABLE 表有并发分支 2 个,非并发分支 4 个。
CREATE TABLE LIST_TABLE(C1 INT) STORAGE(BRANCH (2,4));
8.1.3 HUGE 表
HUGE 表需要建立在混合表空间上。建立 HUGE 表如果不使用默认的混合表空间 MAIN,则必须要先创建一个混合表空间。除去需要建立在混合表空间之上的要求外,关于 HUGE 表的更多信息请参考[第 16 章 管理列存储表](#第 16 章 管理列存储表)。
例 建立一个名称 TS1 的混合表空间,指定 HUGE 数据文件路径为 d:\dmdbms\data\DAMENG\TS1\HUGE1
CREATE TABLESPACE TS1 DATAFILE 'd:\dmdbms\data\DAMENG\TS1\TS1.dbf' SIZE 128 WITH HUGE PATH 'd:\dmdbms\data\DAMENG\TS1\HUGE1';
对于 HUGE 表可以指定如下参数:
- 区大小(一个区的数据行数)。 区大小可以通过设置表的存储属性来指定,区的大小必须是 2 的 n 次方,如果不是则向上对齐。取值范围:1024 行~1024*1024 行。默认值为 65536 行。
- 是否记录区统计信息,即在修改时是否做数据的统计。
- 所属的表空间。创建 HUGE 表,需要通过存储属性指定其所在的表空间,不指定则存储于默认表空间 MAIN 中。HUGE 表指定的表空间只能是混合表空间。
- 文件大小。创建 HUGE 表时还可以指定单个文件的大小,通过表的存储属性来指定,取值范围为 16M~1024*1024M。不指定则默认为 64M。文件大小必须是 2 的 n 次方,如果不是则向上对齐。
- 日志属性。1)LOG NONE:不做镜像;2)LOG LAST:做部分镜像;3)LOG ALL:全部做镜像。
例如下面的建表语句:STUDENT 表的区大小为 65536 行,文件大小为 64M,指定所在的混合表空间为 TS1,做完整镜像,S_comment 列指定的区大小为不做统计信息,其它列(默认)都做统计信息。
CREATE HUGE TABLE STUDENT
(
S_NO INT,
S_CLASS VARCHAR,
S_COMMENT VARCHAR(79) STORAGE(STAT NONE)
)STORAGE(SECTION(65536) , FILESIZE(64), ON TS1) LOG ALL;
8.2 收回多余的空间
DM8 中表和索引对象的所占用的簇要么是全满的状态要么是半满的状态,空闲的簇会被系统自动回收。
8.3 用户和表上的空间限制
8.3.1 用户的空间限制
用户占用的空间是其下所有用户表对象占用空间的总和。可以通过设置表空间配额来限制用户使用的表空间大小,当用户执行创建表、创建索引或者插入更新数据等操作时,如果超过了指定的表空间配额,会报超出配额的错误。如创建用户 TEST_USER 时可指定该用户可以使用的 TEST_TABLESPACE 表空间大小为 50M。
CREATE USER TEST_USER IDENTIFIED BY TEST_password_123 QUOTA 50M ON TEST_TABLESPACE;
对用户的表空间配额限制也可进行更改,如修改用户 TEST_USER 可以使用的 TEST_TABLESPACE 表空间大小为 100M。
ALTER USER TEST_USER QUOTA 100M ON TEST_TABLESPACE;
8.3.2 表对象的空间限制
表对象占用的空间是其上所有索引占用空间的总和。可以限制表对象使用的磁盘空间大小,当在表对象上创建索引或者插入更新数据超过了指定的空间限制时,会报空间不足的错误。如创建表 TEST 时可指定该表对象可使用的最大磁盘空间为 500M。
CREATE TABLE TEST (SNO INT, MYINFO VARCHAR) DISKSPACE LIMIT 500;
对表对象空间的限制也可进行更改,如修改表 TEST 的磁盘空间限制为 50M。
ALTER TABLE TEST MODIFY DISKSPACE LIMIT 50;
8.4 查看模式对象的空间使用
8.4.1 查看用户占用的空间
可以使用系统函数 USER_USED_SPACE 得到用户占用空间的大小,函数参数为用户名,返回值为占用的页的数目。
SELECT USER_USED_SPACE('TEST_USER');
8.4.2 查看表占用的空间
可以使用系统函数 TABLE_USED_SPACE 得到表对象占用空间的大小,函数参数为模式名和表名,返回值为占用的页的数目。
SELECT TABLE_USED_SPACE('SYSDBA', 'TEST');
8.4.3 查看表使用的页数
可以使用系统函数 TABLE_USED_PAGES 得到表对象实际使用页的数目,函数参数为模式名和表名,返回值为实际使用页的数目。
SELECT TABLE_USED_PAGES('SYSDBA', 'TEST');
8.4.4 查看表空闲页堆栈占用的空间
可以使用系统函数 TABLE_FREE_PAGE_STACK_USED_SPACE 得到表空闲页堆栈占用空间的大小,函数参数为模式名和表名,返回值为占用的页的数目。
SELECT TABLE_FREE_PAGE_STACK_USED_SPACE ('SYSDBA', 'TEST');
8.4.5 查看索引占用的空间
可以使用系统函数 INDEX_USED_SPACE 得到索引占用空间的大小,函数参数为索引 ID,返回值为占用的页的数目。
SELECT INDEX_USED_SPACE(33555463);
8.4.6 查看索引使用的页数
可以使用系统函数 INDEX_USED_PAGES 得到索引实际使用页的数目,函数参数为索引 ID,返回值为实际使用页的数目。
SELECT INDEX_USED_PAGES(33555463);
8.5 数据类型的空间使用
各种数据类型占用的空间是不同的,下表 8.1 列出了主要数据类型所需要的空间。
数据类型 | 所需空间 |
---|---|
CHAR | SIZE 为 1~8188 字节, 具体情况受到页面大小和记录大小的共同限制 |
VARCHAR | SIZE 为 1~8188 字节, 具体情况受到页面大小和记录大小的共同限制 |
TINYINT BIT BYTE | 需要 1 个字节 |
SMALLINT | 需要 2 个字节 |
INT | 需要 4 个字节 |
BIGINT | 需要 8 个字节 |
REAL | 需要 4 个字节 |
FLOAT | 需要 8 个字节 |
DOUBLE DOUBLE PRECISION | 需要 8 个字节 |
DEC DECIMAL NUMERIC | SIZE 为 1~20 个字节 |
BINARY | SIZE 为 1~8188 字节, 具体情况受到页面大小和记录大小的共同限制 |
VARBINARY | SIZE 为 1~8188 字节, 具体情况受到页面大小和记录大小的共同限制 |
DATE | 需要 3 个字节 |
TIME | 需要 5 个字节 |
TIMESTAMP DATETIME | 需要 8 个字节 |
TIME WITH TIME ZONE | 需要 7 个字节 |
TIMESTAMP WITH TIME ZONE | 需要 10 个字节 |
INTERVAL YEAR INTERVAL MONTH INTERVAL YEAR TO MONTH |
需要 12 个字节 |
INTERVAL DAY INTERVAL HOUR INTERVAL MINUTE INTERVAL SECOND INTERVAL DAY TO HOUR INTERVAL DAY TO MINUTE INTERVAL DAY TO SECOND INTERVAL HOUR TO MINUTE INTERVAL HOUR TO SECOND INTERVAL MINUTE TO SECOND |
需要 24 个字节 |
BLOB IMAGE LONGVARBINARY |
SIZE 为 1~(100G-1)字节 |
CLOB TEXT LONGVARCHAR |
SIZE 为 1~(100G-1)字节 |