模式对象的空间管理关系到空间的有效使用和数据的合理分布,本章介绍了模式对象相关的存储参数、多余空间的回收机制、模式对象上的空间限制、如何查看已使用的存储空间以及各种数据类型实际使用的空间大小。
1.1 设置存储参数
1.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));
1.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));
1.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 的多少次方,如果不是则向上对齐。取值范围:1024 行~1024*1024 行。默认值为 65536 行。
是否记录区统计信息,即在修改时是否做数据的统计。
所属的表空间。创建 HUGE 表,需要通过存储属性指定其所在的表空间,不指定则存储于默认表空间 MAIN 中。HUGE 表指定的表空间只能是混合表空间。
文件大小。创建 HUGE 表时还可以指定单个文件的大小,通过表的存储属性来指定,取值范围为 16M~1024*1024M。不指定则默认为 64M。文件大小必须是 2 的多少次方,如果不是则向上对齐。
日志属性。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;
1.2 收回多余的空间
DM8 中表和索引对象的所占用的簇要么是全满的状态要么是半满的状态,空闲的簇会被系统自动回收。
1.3 用户和表上的空间限制
1.3.1 用户的空间限制
用户占用的空间是其下所有用户表对象占用空间的总和。可以限制用户使用空间的大小,当用户创建表,创建索引,或者插入更新数据超过了指定的空间限制时,会报空间不足的错误。如创建用户 TEST_USER 时可指定该用户使用的最大磁盘空间为 50M。
CREATE USER TEST_USER IDENTIFIED BY TEST_PASSWORD DISKSPACE LIMIT 50;
对用户的空间限制也可进行更改,如修改用户 TEST_USER 的磁盘空间限制为无限制。
ALTER USER TEST_USER DISKSPACE UNLIMITED;
1.3.2 表对象的空间限制
表对象占用的空间是其上所有索引占用空间的总和。可以限制表对象使用空间的大小,当在表对象上创建索引或者插入更新数据超过了指定的空间限制时,会报空间不足的错误。如创建表 TEST 时可指定该表对象可使用的最大磁盘空间为 500M。
CREATE TABLE TEST (SNO INT, MYINFO VARCHAR) DISKSPACE LIMIT 500;
对表对象空间的限制也可进行更改,如修改表 TEST 的磁盘空间限制为 50M。
ALTER TABLE TEST MODIFY DISKSPACE LIMIT 50;
1.4 查看模式对象的空间使用
1.4.1 查看用户占用的空间
可以使用系统函数 USER_USED_SPACE 得到用户占用空间的大小,函数参数为用户名,返回值为占用的页的数目。
SELECT USER_USED_SPACE('TEST_USER');
1.4.2 查看表占用的空间
可以使用系统函数 TABLE_USED_SPACE 得到表对象占用空间的大小,函数参数为模式名和表名,返回值为占用的页的数目。
SELECT TABLE_USED_SPACE('SYSDBA', 'TEST');
1.4.3 查看表使用的页数
可以使用系统函数 TABLE_USED_PAGES 得到表对象实际使用页的数目,函数参数为模式名和表名,返回值为实际使用页的数目。
SELECT TABLE_USED_PAGES('SYSDBA', 'TEST');
1.4.4 查看索引占用的空间
可以使用系统函数 INDEX_USED_SPACE 得到索引占用空间的大小,函数参数为索引 ID,返回值为占用的页的数目。
SELECT INDEX_USED_SPACE(33555463);
1.4.5 查看索引使用的页数
可以使用系统函数 INDEX_USED_PAGES 得到索引实际使用页的数目,函数参数为索引 ID,返回值为实际使用页的数目。 SELECT INDEX_USED_PAGES(33555463);
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




