深入学习达梦支持的表类型,用法,特性

功能描述

用户数据库建立后,就可以定义基表来保存用户数据的结构。DM 数据库的表可以分为两类,分别为数据库内部表和外部表,数据库内部表由数据库管理系统自行组织管理,而外部表在数据库的外部组织,是操作系统文件。其中内部表包括:数据库基表、HUGE 表和水平分区表。手册中如无明确说明均指数据库基表。下面分别对这各种表的创建与使用进行详细描述。

定义数据库基表

用户数据库建立后,就可以定义基表来保存用户数据的结构。需指定如下信息:

1. 表名、表所属的模式名;

2. 列定义;

3. 完整性约束。

语法:

CREATE [[GLOBAL] TEMPORARY] TABLE [IF NOT EXISTS] <表名定义> <表结构定义>;

<表名定义> ::= [<模式名>.] <表名>

<表结构定义>::=<表结构定义 1> | <表结构定义 2>

<表结构定义 1>::= (<列定义> {,<列定义>} [,<表级约束定义>{,<表级约束定义>}])[<属性子句>] [<延迟段分 配 子 句 >] [< 压 缩 子 句 >][< 高 级 日 志 子 句 >] [<add_log 子 句 >] [<DISTRIBUTE 子句>][<AUTO_INCREMENT 子句>]

<表结构定义 2>::= [<属性子句>] [<延迟段分配子句>] [<压缩子句>]AS <不带 INTO 的 SELECT 语句>[<add_log 子句>] [<DISTRIBUTE 子句>];

<列定义> ::= <不同类型列定义> [<列定义子句>] [<STORAGE 子句>][<存储加密子句>][COMMENT '<列注释>']

<不同类型列定义> ::=<普通列列定义>|<虚拟列列定义>

<普通列定义>::= <列名> <数据类型>

<虚拟列列定义> ::= <列名>[<数据类型>] [GENERATED ALWAYS]AS (<虚拟列定义>) [VIRTUAL]

[VISIBLE]

<列定义子句> ::=

DEFAULT [ON NULL] <列缺省值表达式> |

<自增列子句> |

<列级约束定义> |

DEFAULT [ON NULL] <列缺省值表达式> <列级约束定义> |

<自增列子句> <列级约束定义> |

<列级约束定义> DEFAULT [ON NULL] <列缺省值表达式> |

<列级约束定义> <自增列子句>

<自增列子句> ::=

IDENTITY [(<种子>,<增量>)]|

AUTO_INCREMENT

<列级约束定义> ::= <列级完整性约束>{ <列级完整性约束>}

<列级完整性约束> ::= [CONSTRAINT <约束名>] <column_constraint_action> [<失效生效选项>]

<column_constraint_action>::=

 [NOT] NULL |

 <唯一性约束选项> [USING INDEX TABLESPACE {<表空间名> | DEFAULT}]|

 <引用约束> |

 CHECK (<检验条件>)|

 NOT VISIBLE

<唯一性约束选项> ::=

PRIMARY KEY |

[NOT] CLUSTER PRIMARY KEY |

CLUSTER [UNIQUE] KEY |

UNIQUE

<引用约束> ::= [FOREIGN KEY] REFERENCES [PENDANT] [<模式名>.]<表名>[(<列名>{[,<列名>]})]

[MATCH <FULL|PARTIAL|SIMPLE>][<引用触发动作>] [WITH INDEX]

<引用触发动作> ::=

 <UPDATE 规则> [<DELETE 规则>] |

 <DELETE 规则> [<UPDATE 规则>]

<UPDATE 规则> ::= ON UPDATE <引用动作>

<DELETE 规则> ::= ON DELETE <引用动作>

<引用动作> ::= CASCADE | SET NULL | SET DEFAULT | NO ACTION

<失效生效选项>::=ENABLE | DISABLE

<STORAGE 子句> ::= STORAGE(<STORAGE 项> {,<STORAGE 项>})

<STORAGE 项> ::=

INITIAL <初始簇数目> |

 NEXT <下次分配簇数目> |

MINEXTENTS <最小保留簇数目> |

ON <表空间名> |

FILLFACTOR <填充比例> |

BRANCH <BRANCH 数> |

 BRANCH (<BRANCH 数>, <NOBRANCH 数>) |

NOBRANCH |

CLUSTERBTR |

 WITH COUNTER |

WITHOUT COUNTER |

 USING LONG ROW

<存储加密子句>::= <透明存储加密子句>|<半透明存储加密子句>

<透明存储加密子句>::= <透明存储加密子句 1>|<透明存储加密子句 2>

<透明存储加密子句 1>::= ENCRYPT [<透明加密用法>]

<透明存储加密子句 2>::= ENCRYPT <透明加密用法><散列选项>

<透明加密用法> ::=

WITH <加密算法> [<透明加密选项>] |

<透明加密选项>

<透明加密选项> ::= <透明加密选项 1> |<透明加密选项 2> |<透明加密选项 3>

<透明加密选项 1> ::= AUTO

<透明加密选项 2> ::= AUTO BY <列存储密钥>

<透明加密选项 3> ::= AUTO BY WRAPPED <列存储密钥的密文>

<半透明存储加密子句> ::= ENCRYPT [WITH <加密算法>] MANUAL [<半透明加密选项>][<散列选项>]

<半透明加密选项> ::= <半透明加密选项 1> | <半透明加密选项 2> | <半透明加密选项 3>

<半透明加密选项 1> ::= <可见用户列表>

<半透明加密选项 2> ::= BY <列存储密钥> [<可见用户列表>]

<半透明加密选项 3> ::= BY WRAPPED <列存储密钥的密文> [<可见用户列表>]

<可见用户列表> ::= USER ([<用户名> {,<用户名>}])

<散列选项> ::= HASH WITH <散列算法> [<加盐选项>]

<加盐选项> ::= [NO] SALT

<表级约束定义>::=[CONSTRAINT <约束名>] <表级约束子句>[<失效生效选项>]

<表级约束子句>::=<表级完整性约束>

<表级完整性约束> ::=

 <唯一性约束选项> (<列名> {,<列名>}) [USING INDEX TABLESPACE{ <表空间名> | DEFAULT}]|

FOREIGN KEY (<列名>{,<列名>}) <引用约束> |

CHECK (<检验条件>)

<属性子句>::= <表空间子句>|

ON COMMIT <DELETE | PRESERVE> ROWS|

<空间限制子句>|

<STORAGE 子句>

<表空间子句>::=TABLESPACE <表空间名>

<空间限制子句> ::=

DISKSPACE LIMIT <空间大小>|

DISKSPACE UNLIMITED

<延迟段分配子句> ::=

SEGMENT CREATION IMMEDIATE |

SEGMENT CREATION DEFERRED

<压缩子句> ::=

 COMPRESS |

 COMPRESS (<列名> {,<列名>}) |

 COMPRESS EXCEPT (<列名> {,<列名>})

<高级日志子句> ::= WITH ADVANCED LOG

<add_log 子句>::= ADD LOGIC LOG

<DISTRIBUTE 子句> ::=

 DISTRIBUTED [RANDOMLY | FULLY]|

DISTRIBUTED BY [<HASH>](<列名> {,<列名>})|

DISTRIBUTED BY RANGE (<列名> {,<列名>})(<范围分布项> {,<范围分布项>})|

DISTRIBUTED BY LIST (<<列名> {,<列名>}>)(<列表分布项> {,<列表分布项>})

<范围分布项> ::=

VALUES LESS THAN (<范围表达式>{,<范围表达式>}) ON <实例名>|

VALUES EQU OR LESS THAN (<范围表达式>{,<范围表达式>}) ON <实例名>

<范围表达式> ::= MAXVALUE | <表达式>

<列表分布项> ::= VALUES (DEFAULT | <表达式>{,<表达式>}) ON <实例名>

<AUTO_INCREMENT 子句>::= AUTO_INCREMENT [=] <起始边界值>

<不带 INTO 的 SELECT 语句> ::= <查询表达式>|<带参数查询语句>

<带参数查询语句>::=<子查询> | (<带参数查询语句>)

参数:

1. < 模式名 > 指明该表属于哪个模式,缺省为当前模式;
2. < 表名 > 指明被创建的基表名,基表名最大长度 128 字节;
3. < 列名 > 指明基表中的列名,列名最大长度 128 字节;
4. < 数据类型 > 指明列的数据类型;支持设置定长串的字符长度,如 char(n char)
n 为在 1~32767 中的整数;当 ini 参数 NVARCHAR_LENGTH_IN_CHAR 设置为 1 时,支持
nchar 设置定长串的字符长度,此时 nchar(n) 等价于 char(n char) 的处理;虚拟列不支
持设置定长串的字符长度;
5. < 列缺省值表达式 > 如果之后的 INSERT 语句省略了插入的列值,那么此项为列值
指定一个缺省值,可以通过 DEFAULT 指定一个值。 DEFAULT 表达式串的长度不能超过 2048
字节;对指定了 ON NULL 的列,插入数据时若数据为 NULL ,则该位置数据被替换为列缺省
值进行插入;
6. < 列级完整性约束定义 > 支持同时指定多个列级完整性约束,各约束之间使用空格
分隔。列级完整性约束中各个参数含义如下:
1) NULL 指明指定列可以包含空值,为缺省选项;
2) NOT NULL 非空约束,指明指定列不可以包含空值;
3) UNIQUE 唯一性约束,指明指定列作为唯一关键字;
4) PRIMARY KEY 主键约束,指明指定列作为基表的主关键字, INI 参数
PK_WITH_CLUSTER 控制该约束默认为 CLUSTER NOT CLUSTER
5) CLUSTER PRIMARY KEY 主键约束,指明指定列作为基表的聚集索引(也叫
聚簇索引)主关键字;
6) NOT CLUSTER PRIMARY KEY 主键约束,指明指定列作为基表的非聚集索引
主关键字;
7) CLUSTER KEY 指定列为聚集索引键,但是是非唯一的;
8) CLUSTER UNIQUE KEY 指定列为聚集索引键,并且是唯一的;
9) USING INDEX TABLESPACE < 表空间名 > 指定索引存储的表空间。
缺省该子句或使用 USING INDEX TABLESPACE DEFAULT 均为缺省情况。缺省
情况下,当约束使用了 CLUSTER 关键字( CLUSTER PRIMARY KEY CLUSTER
KEY CLUSTER UNIQUE KEY 或当 INI 参数 PK_WITH_CLUSTER=1 时的
PRIMARY KEY )时,约束将使用表聚集索引的存储表空间作为约束的缺省存储
表空间;
当约束未使用 CLUSTER 关键字时,约束将使用 <INDEX_TABLESPACE 子句 >
指定的默认索引表空间作为约束的缺省存储表空间, 若未指定用户默认索引表
空间,将使用表聚集索引的存储表空间。
10) REFERENCES 指明指定列的引用约束。引用约束要求引用对应列类型必须基
本一致。所谓基本,是因为 CHAR VARCHAR BINARY VARBINARY
TINYINT SMALLINT INT 在此被认为是一致的。如果有 WITH INDEX 选项,
则为引用约束建立索引,否则不建立索引,通过其他内部机制保证约束正确性;
11) CHECK 检查约束,指明指定列必须满足的条件;
12) NOT VISIBLE 列不可见,当指定某列不可见时,使用 SELECT * 进行查询时将
不添加该列作为选择列。使用 INSERT 无显式指定列列表进行插入时,值列表
不能包含隐藏列的值。
7. < 失效生效选项 > 用于指定约束的状态: ENABLE 启用; DISABLE 失效。缺省为启
用。
8. < 表级完整性约束 > 中的参数:
1) UNIQUE 唯一性约束,指明指定列或列的组合作为唯一关键字;
2) PRIMARY KEY 主键约束,指明指定列或列的组合作为基表的主关键字。指明
CLUSTER ,表明是主关键字上聚集索引;指明 NOT CLUSTER ,表明是主关键
字上非聚集索引;也可通过 INI 参数 PK_WITH_CLUSTER 控制该约束默认为
CLUSTER NOT CLUSTER
3) USING INDEX TABLESPACE < 表空间名 > 指定索引存储的表空间;
4) FOREIGN KEY 指明表级的引用约束,如果使用 WITH INDEX 选项,则为引用
约束建立索引,否则不建立索引,通过其他内部机制保证约束正确性;
5) CHECK 检查约束,指明基表中的每一行必须满足的条件;
6) 与列级约束之间不应该存在冲突。
9. ON COMMIT<DELETE | PRESERVE>ROWS 用来指定临时表( TEMPORARY )中的
数据是事务级或会话级的,缺省情况下是事务级。 ON COMMIT DELETE ROWS :指定临时
表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除; ON COMMIT PRESERVE
ROWS :指定临时表是会话级的,会话结束时才清空表;
10. CHECK < 检验条件 > 指明表中一列或多列能否接受的数据值或格式;
11. < 查询表达式 > < 子查询 > 定义请查看数据查询章节;
12. STORAGE 项中:
BRANCH NOBRANCH 是堆表创建关键字,堆表为“扁平 B 树表。这两个参数用来指 ”
定堆表并发分支 BRANCH 和非并发分支 NOBRANCH 的数目。 <BRANCH > 取值范围为
1~64 <NOBRANCH > 取值范围为 1~64
分支数目主要用于插入场景中。适当提高分支数量可有效地提升并发数据处理效率,但
是分支过多又会增加扫描的代价,因此,合适的 <BRANCH > <NOBRANCH > 值需用
户根据实际情况来决定。 <BRANCH > 主要在 FLDR 导入和查询插入等并发、批量插入场
景中使用; <NOBRANCH > 在非并发、单行插入场景中使用。
1) NOBRANCH :指定创建的表为堆表,并发分支个数为 0 ,非并发分支个数为
1
2) BRANCH <BRANCH >, <NOBRANCH > ):指定创建的表为堆表,并发
分支个数为 <BRANCH > ,非并发个数为 <NOBRANCH >
3) BRANCH <BRANCH > :指定创建的表为堆表,并发分支个数为 <BRANCH
> ,非并发分支个数为 0
13. CLUSTERBTR 指定创建的表为非堆表,即普通 B 树表;
14. < 虚拟列定义 > 指明定义虚拟列的表达式;
15. < 高级日志子句 > 指定创建日志辅助表;
16. <add_log 子句 > 开启表的物理逻辑日志记录功能,缺省为不开启。 <add_log
> 开启时和 INI 参数 RLOG_IGNORE_TABLE_SET=1 时功能一样;
17. <AUTO_INCREMENT 子句 > 用于指定隐式插入值的起始边界值,即当隐式插入
时,系统自动增长的自增列值必须大于等于起始边界值。不指定默认为 1 。要求大于等于 0
小于数值的最大值;
18. < 表空间子句 > 不能和 <STORAGE 子句 > 中的 ON < 表空间名 > 同时使用。
语句功能:
供具有 DBA 角色(三权分立)、 DB_OBJECT_ADMIN 角色(四权分立)或具有 CREATE 
TABLE CREATE ANY TABLE 权限的用户定义基表。

举例:

create table s2.T9(id int primary key);

insert into s2.t9 values(1);commit;



CREATE TABLE S2.T8

(

 PRODUCT_REVIEWID INT IDENTITY(1,1),

 PRODUCTID INT NOT NULL,

 NAME VARCHAR(50) NOT NULL,

 REVIEWDATE DATE NOT NULL,

 EMAIL VARCHAR(50) NOT NULL,

 RATING INT NOT NULL,

 COMMENTS TEXT,

 PRIMARY KEY(PRODUCT_REVIEWID),

 FOREIGN   KEY(PRODUCTID)  REFERENCES  S2.T9(ID),

 CHECK(RATING IN(1,2,3,4,5))

);
系统执行建表语句后,就在数据库中建立了相应的基表,并将有关基表的定义及完整性
约束条件存入数据字典中。

定义外部表

需指定如下信息:

1. 表名、表所属的模式名;

2. 列定义;

3. 控制文件和数据文件所在目录。

语法:

CREATE EXTERNAL TABLE [IF NOT EXISTS] <表名定义> <表结构定义>;

<表名定义> ::=[<模式名>.]<表名>

<表结构定义> ::= (<列定义> {,<列定义>}) <FROM 子句>

<列定义> ::= <列名> <数据类型> [COMMENT '<列注释>']

<列定义> 参见定义数据库基表说明

<FROM 子句> = <FROM 子句 1> | <FROM 子句 2>

<FROM 子句 1> ::= FROM <控制文件选项>

<FROM 子句 2> ::= FROM DATAFILE <数据文件选项> [<数据文件参数列表>]

<数据文件参数列表> ::= PARMS(<参数选项> {,<参数选项>})

<参数选项> ::=

FIELDS DELIMITED BY <表达式> |

RECORDS DELIMITED BY <表达式>|

ERRORS <n>|

BADFILE '<错误日志文件名称>'|

LOG '<日志文件名称>'|

NULL_STR <NULL 字符串>|

SKIP <跳过行数>|

CHARACTER_CODE <文件字符集>

<控制文件选项> ::= DEFAULT DIRECTORY <目录对象名> LOCATION ('<控制文件名>')

<数据文件选项> ::= DEFAULT DIRECTORY <目录对象名> LOCATION ('<数据文件名>')

参数:

1. < 模式名 > 指明该表属于哪个模式,缺省为当前模式;
2. < 表名 > 指明被创建的外部基表名;
3. < 列名 > 指明基表中的列名;
4. < 数据类型 > 指明列的数据类型,暂不支持多媒体类型;其余同定义数据库基表 中的说明;
5. < 参数选项 >
FIELDS 表示列分隔符;
RECORDS 表示行分隔符,缺省为回车;
ERRORS 表示忽略外部表数据转换中出现错误的行数,取值范围为大于 0 的正整数,缺
省为 0 ,表示不忽略错误;
BADFILE 表示错误日志文件( .bad 文件)名称,存放在指定目录下。缺省情况下,将
在查询外部表时自动生成(若中途无错误数据,将不生成 .bad 文件),缺省 BADFILE 文件前
缀为“表名 + id ”;
LOG 表示日志文件( .log 文件)名称,存放在指定目录下。缺省情况下,将在查询外
部表时自动生成,缺省 LOG 文件前缀为“表名 + id ”;
NULL_STR 指定数据文件中 NULL 值的表示字符串,默认忽略此参数;
SKIP 指定跳过数据文件起始的逻辑行数,默认为 0
CHARACTER_CODE 指定数据文件中数据的编码格式,默认为 GBK ,可选项有 GBK
UTF-8 SINGLE_BYTE EUC-KR
6. < 表达式 > 字符串或十六进制串类型表达式;
7. < 目录对象名 > 指控制文件或数据文件所属的目录对象的名称。
语句功能:
供具有 DBA 角色(三权分立)、 DB_OBJECT_ADMIN 角色(四权分立)或具有 CREATE
TABLE CREATE ANY TABLE 权限的用户定义外部基表。 MPP 环境下不支持创建外部表。

举例:

1、编写数据文件

1|2|3

4|5|6

2、创建目录对象

CREATE OR REPLACE DIRECTORY "EXTDIR_1" AS 'e:\test';

3、建表

CREATE EXTERNAL TABLE EXT_TABLE1(

C1 INT,

C2 INT,

C3 INT

) FROM DATAFILE DEFAULT DIRECTORY EXTDIR_1 LOCATION ('data.txt') PARMS(FIELDS DELIMITED BY '|', RECORDS DELIMITED BY 0x0d0a);

select * from EXT_TABLE1;

定义HUGE表

达梦数据库中,表的数据存储方式分为行存储和列存储。行存储是以记录为单位进行存储的,数据页面中存储的是完整的若干条记录;列存储是以列为单位进行存储的,每一个列的所有行数据都存储在一起,而且一个指定的页面中存储的都是某一个列的连续数据。Huge File System(HFS)是达梦数据库实现的,针对海量数据进行分析的一种高效、简单的列存储机制。列存储表(也称为 HUGE 表)就是建立在 HFS 存储机制上的一种表。

HUGE 表的存储方式有以下几个优点:

(1)同一个列的数据都是连续存储的,可以加快某一个列的数据查询速度;

(2)连续存储的列数据,具有更大的压缩单元和数据相似性,可以获得远优于行存储的压缩效率,压缩的单位是区;

(3)条件扫描借助数据区的统计信息进行精确过滤,可以进一步减少 IO,提高扫描效率;

(4)允许建立二级索引;

(5)支持以 ALTER TABLE 的方式添加或者删除 PK 和 UNIQUE 约束。

DM 支持两种类型的 HUGE 表:非事务型 HUGE 表和事务型 HUGE 表

语法:

CREATE HUGE TABLE [IF NOT EXISTS] <表名定义> <表结构定义>[<PARTITION 子句>][<表空间子

句>][<STORAGE 子句 1>][<压缩子句>][<日志属性>][<DISTRIBUTE 子句>];

<表名定义> ::= [<模式名>.] <表名>

<表结构定义> ::=<表结构定义 1> | <表结构定义 2>

<表结构定义 1> ::= (<列定义> {,<列定义>} [<表级约束定义>{,<表级约束定义>}])

<表结构定义 2> ::= AS <不带 INTO 的 SELECT 语句>[<DISTRIBUTE 子句>]

< 列定义 > ::=< 列 名 > < 数据类型 >[DEFAULT [ON NULL] < 列 缺 省 值 表 达 式 >][< 列级约束定义>][<STORAGE 子句 2>][<存储加密子句>][COMMENT '<列注释>']

<表级约束定义> ::= [CONSTRAINT <约束名>] <表级完整性约束>

<表级完整性约束> ::=

 <唯一性约束选项> (<列名> {,<列名>}) [USING INDEX TABLESPACE {<表空间名> | DEFAULT}]|CHECK (<检验条件>)

<列级约束定义> ::= <列级完整性约束>{ <列级完整性约束>}

<列级完整性约束> ::= [CONSTRAINT <约束名>]<huge_column_constraint_action>

<huge_column_constraint_action>::=

 [NOT] NULL |

 <唯一性约束选项> [USING INDEX TABLESPACE {<表空间名> | DEFAULT}]

<唯一性约束选项> ::=

PRIMARY KEY |

UNIQUE

<存储加密子句> ::= <透明存储加密子句>

<透明存储加密子句>参见 3.5.1.1 定义数据库基表

<PARTITION 子句> 参见 3.5.1.4 定义水平分区表

<表空间子句> ::= TABLESPACE <混合表空间名>

<STORAGE 子句 1> ::= STORAGE(<STORAGE1 子项>,{<STORAGE1 子项>,} ON <混合表空间名>)

<STORAGE1 子项>::=

[SECTION (<区大小>)] |

[INITIAL <文件初始大小>] |

[FILESIZE (<文件大小>)] |

[STAT [NONE| SYNCHRONOUS | ASYNCHRONOUS][ON | EXCEPT ( col_lst )] ] |

[<WITH|WITHOUT> DELTA]

<STORAGE 子句 2> ::= STORAGE(STAT NONE)

<压缩子句> ::=

 COMPRESS [LEVEL <压缩级别>] [<压缩类型>]|

COMPRESS [LEVEL <压缩级别>] [<压缩类型>] (<列名> [LEVEL <压缩级别>] [<压缩类型>] {,<列名> [LEVEL <压缩级别>] [<压缩类型>] })|

COMPRESS [LEVEL <压缩级别>] [<压缩类型>] EXCEPT (<列名>{,<列名>})

<压缩类型>::= FOR 'QUERY [LOW | HIGH]'

<DISTRIBUTE 子句> ::=

DISTRIBUTED [RANDOMLY | FULLY]|

DISTRIBUTED BY [HASH](<列名> {,<列名>})|

DISTRIBUTED BY RANGE (<列名> {,<列名>})(<范围分布项> {,<范围分布项>})|

DISTRIBUTED BY LIST (DEFAULT|<<列名> {,<列名>}>)(<列表分布项> {,<列表分布项>})

<范围分布项> ::=

VALUES LESS THAN (<表达式>{,<表达式>}) ON <实例名> |

VALUES EQU OR LESS THAN (<表达式>{,<表达式>}) ON <实例名>

<列表分布项> ::= VALUES (<表达式>{,<表达式>}) ON <实例名>

<日志属性> ::=

LOG NONE|

LOG LAST|

LOG ALL

参数:

1. < 表名 > 指明被创建的 HUGE 表名。普通 HUGE 表,由于表名 + 辅助表名最大长度
不大于 128 字节,则表名不大于 123 字节;分区 HUGE 表,由于子表名 + 辅助表名的长度不
大于 128 字节,则子表名不大于 123 字节;
2. < 区大小 > 指一个区的数据行数。区的大小必须是 2 n 次方,如果不是则向上对
齐。取值范围: 1024 ~1024*1024 行。不指定则默认值为 65536 行;
3. <storage 子句 1> FILESIZE (< 文件大小 >) 指定 HUGE 表列存数据文件的大小,
单位为 MB ,取值范围为 16~1024*1024 。文件大小必须是 2 n 次方,如果不是则向上对
齐; INITIAL (< 文件初始大小 >) 指定 HUGE 表列存数据文件的初始大小。
1) 如果未指定 FILESIZE ,则设置为 INI 参数 HUGE_DEFAULT_FILE_SIZE 指定的
值;
2) 如果未指定 INITIAL ,则获取 INI 参数 HUGE_DEFAULT_FILE_INIT_SIZE ,如果
该参数非 0 ,则取该 INI 参数与 FILESIZE 的较小值;如果该 INI 参数为 0 ,则设
定为该表的 FILESIZE
4. <storage 子句 1> STAT [NONE| SYNCHRONOUS | ASYNCHRONOUS] [ON |
EXCEPT ( col_lst )] 设置 HUGE 表的统计状态。
1) 设置表的统计状态 [NONE| SYNCHRONOUS | ASYNCHRONOUS]
a) NONE :不计算统计信息,在数据修改时不做数据的统计。
b) SYNCHRONOUS :实时计算统计信息。
c) ASYNCHRONOUS :异步计算统计信息,仅支持 WITH DELTA HUGE
表。
d) 省略此项:如果是 WITH DELTA HUGE 表,统计状态参考 INI 参数
HUGE_STAT_MODE ;如果是 WITHOUT DELTA 为实时统计。
2) 设置列 [<ON | EXCEPT> ( col_lst )] ,用于设置表中特定某些列的统计信息
状态
a) 如果列设置省略,则表示所有列上的统计开关均为打开。
b) 列设置仅对计算统计信息时有效;如果表的统计状态是 NONE 状态,此
时设置列,则报错。
c) 如果是 ON ,则对列表中的列计算统计信息,其余的不计算统计信息。
d) 如果是 EXCEPT ,则对列表中的列不计算统计信息,其余的计算统计信息。
e) 不支持同时在表和列的定义中指定列的统计信息状态,如果在表定义
<storage 子句 1> stat 子句中指定了列,在表中某些列定义的
<storage 子句 2> 中也指定了 stat 子句,则报错。
f) 允许下列情况:表设置了要计算统计信息,但所有列上都设置不计算统计
信息。
5. <storage 子句 2> STAT NONE 对某一列进行设置,该列不计算统计信息,在
修改时不做数据的统计;此处不设置 STAT NONE ,表示进行统计;
6. < 混合表空间名 > 指要创建的 HUGE 表所属的混合表空间。不指定则存储于默认用
户表空间 MAIN 中。不支持同时使用 < 表空间子句 > <storage 子句 1> 指定混合表空间名;
7. < 压缩级别 > 指定列的压缩级别,有效值范围为: 0~10 ,分别代表不同的压缩算法
和压缩级别。有两种压缩算法: SNAPPY ZIP 10 采用 SNAPPY 算法轻量级方式压缩。 2~9
采用 ZIP 算法压缩, 2~9 代表压缩级别,值越小表示压缩比越低、压缩速率越快;值越大表
示压缩比越高、压缩速度越慢。 0 1 为快捷使用,默认值为 0 0 等价于 LEVEL 2 1 等价
LEVEL 9
8. < 压缩类型 > 指定列压缩类型。 FOR 'QUERY [LOW]' 表示进行规则压缩; FOR
'QUERY HIGH' 表示进行规则压缩与通用压缩结合,前者的压缩比一般在 1:1 1:3 之间,后者
一般为 1:3 1:5 之间。规则压缩方式一般适用于具有一定的数据规则的数据的压缩,例如
重复值较多等。若某列的类型为字符串类型且定义长度超过 48 ,则即使指定规则压缩也无
效,实际只进行通用压缩;
9. < 日志属性 > 此属性仅对非事务型 HUGE 表有效,支持通过做日志来保证数据的完
整性。完整性保证策略主要是通过数据的镜像来实现的,镜像的不同程度可以实现不同程度
的完整性恢复。三种选择: 1 LOG NONE :不做镜像。相当于不做数据一致性的保证,如
果出错只能手动通过系统函数 SF_REPAIR_HFS_TABLE( 模式名 , 表名 ) 来修复表数据。 2
LOG LAST :做部分镜像。但是在任何时候都只对当前操作的区做镜像,如果当前区的操作
完成了,这个镜像也就失效了,并且可能会被下一个被操作区覆盖,这样做的好处是镜像文
件不会太大,同时也可以保证数据是完整的。但有可能遇到的问题是:一次操作很多的情况
下,有可能一部分数据已经完成,另一部分数据还没有来得及做的问题。 3 LOG ALL :全
部做镜像。在操作过程中,所有被修改的区都会被记录下来,当一次操作修改的数据过多时,
镜像文件有可能会很大,但能够保证操作完整性。默认选择为 LOG LAST
10. < WITH|WITHOUT> DELTA WITH DELTA 表示创建事务型 HUGE 表; WITHOUT
DELTA 表示创建非事务型 HUGE 表,缺省为 WITH DELTA 。若创建数据库时使用参数
HUGE_WITH_DELTA 的缺省值 1 ,则不支持创建非事务型 HUGE 表。
语句功能:
供具有 DBA 角色(三权分立)、 DB_OBJECT_ADMIN 角色(四权分立)或具有 CREATE
TABLE CREATE ANY TABLE 权限的用户创建 HUGE 表。

举例(若创建数据库时使用参数 HUGE_WITH_DELTA 的缺省值 1,则不支持创建非事务型 HUGE 表):

创建非事务性HUGE表:

CREATE HUGE TABLE T1 (A INT, B INT) STORAGE(WITHOUT DELTA);

创建事务性HUGE表:

CREATE HUGE TABLE T2 (A INT, B INT) STORAGE(WITH DELTA);

定义水平分区表

水平分区包括范围分区、哈希分区和列表分区三种。水平分区表的创建需要通过<PARTITION 子句>指定。

范围(RANGE)分区,按照分区列的数据范围,确定实际数据存放位置的划分方式。

列表(LIST)分区,通过指定表中的某一个列的离散值集,来确定应当存储在一起的数据。范围分区是按照某个列上的数据范围进行分区的,如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用 LIST 分区。一般来说,对于数字型或者日期型的数据,适合采用范围分区的方法;而对于字符型数据,取值比较固定的,则适合于采用 LIST 分区的方法。

哈希(HASH)分区,对分区列值进行 HASH 运算后,确定实际数据存放位置的划分方式,主要用来确保数据在预先确定数目的分区中平均分布,允许只建立一个 HASH 分区。在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或 LIST 分区。在这种情况下,DM 哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值(HASH 值)将行映射到分区中。当用户向表中写入数据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。在哈希分区中,用户无法预测数据将被写入哪个分区中。

在很多情况下,经过一次分区并不能精确地对数据进行分类,这时需要多级分区表。在进行多级分区的时候,三种分区类型还可以交叉使用。

语法:

CREATE TABLE [IF NOT EXISTS] <表名定义> <表结构定义>;

<表名定义> ::= [<模式名>.] <表名>

<表结构定义>::= (<列定义> {,<列定义>} [,<表级约束定义>{,<表级约束定义>}])<PARTITION子句>[<属性子句>][<压缩子句>] [<ROW MOVEMENT子句>][<add_log子句>][<DISTRIBUTE子句>]

<列定义>、<表级约束定义>、<属性子句>、<压缩子句>、<DISTRIBUTE子句>的语法,参见定义数据库基表说明

<PARTITION子句> ::= PARTITION BY <PARTITION项>

<PARTITION项> ::=

RANGE (<列名>{,<列名>}) [INTERVAL (<间隔表达式>)] [<SUBPARTITION 子句>{,< SUBPARTITION 子句>}}](<RANGE分区项> {,<RANGE分区项>}) |

HASH (<列名>{,<列名>}) [<SUBPARTITION 子句>{,<SUBPARTITION 子句>}}]PARTITIONS <分区数> [<STORAGE HASH 子句>]|

HASH(<列名>{,<列名>})[<SUBPARTITION 子句>{,<SUBPARTITION 子句>}] (<HASH分区项> {,<HASH分区项>})|

LIST(<列名>)[<SUBPARTITION 子句>{,<SUBPARTITION 子句>}](<LIST分区项> {,<LIST分区项>})

<RANGE分区项>::= PARTITION <分区名> VALUES [EQU OR] LESS THAN (< <常量表达式>|<日期函数表达式>|MAXVALUE >{,< <常量表达式>|<日期函数表达式>|MAXVALUE >}) [<表空间子句>][<STORAGE子句>][<子分区描述项>]

<日期函数表达式> ::= <to_date函数表达式> | <to_datetime函数表达式> | <to_timestamp函数表达式>

<HASH分区项>::= PARTITION <分区名> [<表空间子句>][<STORAGE子句>][<子分区描述项>]

<LIST分区项>::= PARTITION <分区名> VALUES (DEFAULT|<表达式>,{<表达式>}>) [<表空间子句>][<STORAGE子句>][<子分区描述项>]

<子分区描述项> ::=

(<RANGE子分区描述项>{,<RANGE子分区描述项>})|

(<HASH子分区描述项>{,<HASH子分区描述项>})|

SUBPARTITIONS <分区数> [<STORAGE HASH 子句>]|

(<LIST子分区描述项>{,<LIST子分区描述项>})

<RANGE子分区描述项> ::= <RANGE子分区项>[<子分区描述项>]

<HASH子分区描述项> ::= <HASH子分区项>[<子分区描述项>]

<LIST子分区描述项> ::= <LIST子分区项>[<子分区描述项>]

<RANGE子分区项> ::=

SUBPARTITION <分区名> VALUES [EQU OR] LESS THAN (<常量表达式|<日期函数表达式>|MAXVALUE>){,<常量表达式|<日期函数表达式>|MAXVALUE>}) [<表空间子句>][<STORAGE子句>]

<HASH子分区项> ::= SUBPARTITION <分区名> [<表空间子句>][<STORAGE子句>]

<LIST子分区项> ::= SUBPARTITION <分区名> VALUES (DEFAULT|<<表达式>,{<表达式>}>) [<表空间子句>][<STORAGE子句>]

<间隔表达式> ::= <日期间隔函数> | <数值常量>

<SUBPARTITION 子句>::= <RANGE子分区模板项>|<HASH子分区模板项>|<LIST子分区模板项>

<RANGE子分区模板项> ::= SUBPARTITION BY RANGE (<列名>{,<列名>})[SUBPARTITION TEMPLATE (<RANGE子分区项> {,<RANGE子分区项>})]

<HASH子分区模板项> ::=

SUBPARTITION BY HASH (<列名>{,<列名>})SUBPARTITION TEMPLATE SUBPARTITIONS <分区数> [<STORAGE HASH 子句>]|

SUBPARTITION BY HASH (<列名>{,<列名>})SUBPARTITION TEMPLATE (<HASH子分区项> {,<HASH子分区项>})

<LIST子分区模板项> ::= SUBPARTITION BY LIST (<列名>{,<列名>})[SUBPARTITION TEMPLATE (<LIST子分区项> {,<LIST子分区项>})]

<STORAGE HASH 子句> ::= STORE IN (<表空间名列表>)

<分区表封锁子句> ::=

    LOCK PARTIITONS |

    LOCK ROOT

<表空间子句> ::= 3.5.1.1节中<表空间子句>

<STORAGE子句> ::= 3.5.1.1节中<STORAGE子句> | HASHPARTMAP(<哈希分区表定位方式>)

<哈希分区表定位方式> ::= 0|1|2

<ROW MOVEMENT子句> ::=

ENABLE ROW MOVEMENT |

DISABLE ROW MOVEMENT

参数:

1. < 模式名 > 指明该表属于哪个模式,缺省为当前模式;
2. < 表名 > 指明被创建的基表名,基表名最大长度 128 字节;如果是分区表,主表名
和分区名遵循“主表名 _ 分区名”总长度最大不超过 128 字节。按数目方式创建 HASH 分区,
子分区命名规则为“ DMHASHPART+ 分区序号,” 其他方式的分区名由用户指定;
3. < 子分区描述项 > 多级分区表支持自定义子分区描述项,自定义的子分区描述项分
区类型与分区列必须与子分区模板一致。如果子分区模板和自定义子分区描述项均指定了分
区信息则按自定义分区描述项处理;
4. <STORAGE HASH 子句 > 指定哈希分区依次使用的表空间;
5. <ROW MOVEMENT 子句 > 设置行迁移功能,仅对行存储的水平分区表有效,其它
表类型自动忽略。 ENABLE ROW MOVEMENT 打开行迁移,允许更新后数据发生跨分区的移
动。 DISABLE ROW MOVEMENT ,关闭行迁移,不允许更新后数据发生跨分区的移动。缺省
DISABLE ROW MOVEMENT
6. < 间隔表达式 > 中日期间隔函数为 NUMTOYMINTERVAL NUMTODSINTERVAL
数值常量为:整型、 DEC 类型。使用了 < 间隔表达式 > 的分区表称为间隔分区表。当对间隔
分区表中的数据进行插入或更新操作时,若新的数据无法匹配现有的分区子表,则系统将自
动以用户指定的现有分区的末尾临界值为起始值,以 < 间隔表达式 > 指定的值为间隔值创建
一个可以匹配新数据的间隔分区。用户可通过查看系统表 SYSHPARTTABLEINFO 来获取新建
分区的分区表 ID 以及分区名等信息。该功能可方便数据库管理员对分区表的管理;
7. < 分区表封锁子句 > 指定分区表执行查询或增删子表 DDL 采用的封锁方式。
LOCK PARTITIONS :使用细粒度的封锁模式。该模式下,增删子表 DDL 时从根表到目
标子表路径上所有的主表都进行 IX+S 封锁,查询时同样对路径上所有的表都进行 IS 封锁,
能够允许增删子表与查询的并发。指定 LOCK PARTITIONS 模式的分区表查询时,可能会增
删子表,如果后续查询不涉及被增删的子表,则查询可以正常完成;否则查询可能报错。不
支持将间隔分区表设置为 LOCK PARTITIONS 模式。由于指定 LOCK PARTITIONS 模式的分
区表查询时可能会增删子表,所以该模式的分区表的查询计划不可重用,每次执行都需要重
新分析;因此,在事务密集型环境中, LOCK PARTITIONS 配置需慎用。同样的原因,而语
句块的所有语句属于同一个计划,所以语句块中对 LOCK PARTITIONS 模式的表的查询必须
使用动态执行的方式。因增删 HASH 分区表子表会导致数据重组,所以即使指定了 LOCK
PARTITIONS 细粒度的封锁模式,增删 HASH 分区子表时,仍采用 LOCK ROOT 封锁根表模
式。指定 LOCK PARTITIONS 模式时,不支持 SPLIT MERGE 分区。
LOCK ROOT :执行时只封锁根表的模式。该模式下,增删子表 DDL 时对根表进行 X
锁,查询时对根表进行 IS 封锁,增删子表与查询无法并发。
8. < 表空间子句 > 不能和 <STORAGE 子句 > 中的 ON < 表空间名 > 同时使用。

举例:

创建一个范围分区表 callinfo,用来记录用户 2024 年的电话通讯信息,包括主叫号码、被叫号码、通话时间和时长,并且根据季度进行分区

CREATE  TABLE  callinfo1(

caller CHAR(15),

callee CHAR(15),

time  DATETIME,

duration  INT

)

PARTITION BY RANGE(time)(

PARTITION p1 VALUES LESS THAN ('2024-04-01'),

PARTITION p2 VALUES LESS THAN ('2024-07-01'),

PARTITION p3 VALUES LESS THAN ('2024-10-01'),

PARTITION p4 VALUES EQU OR LESS THAN (MAXVALUE));

查询p1中的数据:

SELECT * FROM callinfo PARTITION (p1);

创建List分区表:

CREATE  TABLE  sales(

sales_id INT,

saleman CHAR(20),

saledate  DATETIME,

city CHAR(10)

)

PARTITION BY LIST(city)(

PARTITION p1 VALUES ('北京', '天津'),

PARTITION p2 VALUES ('上海', '南京', '杭州'),

PARTITION p3 VALUES ('武汉', '长沙'),

PARTITION p4 VALUES ('广州', '深圳'),

PARTITION p5 VALUES (default)

);

创建HASH分区表:

CREATE  TABLE  sales02(

sales_id  INT,

saleman CHAR(20),

saledate DATETIME,

city  CHAR(10)

)

PARTITION BY HASH(city)

PARTITIONS 4 STORE IN (ts1, ts2, ts3, ts4);

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值