SinoDB建表及注意事项

1. 选择一个有效的表名称

  • 最长字符长度为 128 个字符

  • 可以包含字母数字字符和“_”,不能包含其他特殊字符

  • SinoDB支持 ANSI 分隔标识符,分隔标识符是一个封闭在双引号内的对象名称,它可以是:
    保留词
    包含空格和特殊字符
    大小写敏感
    以非字母字符开始,比如“1table”

  • 必须设定 DELIMIDENT,才能使用分隔标识符
    export DELIMIDENT=ON

2. 指定表的extent大小

  表磁盘空间按extent为单元进行分配。一个extent是磁盘上一定数量的连续页,连续页的数量在表创建时被指定。每个表都含有两个extent大小:

  • EXTENT SIZE——预估数据行和extent的大小。分配给表的首个extent的大小。表创建时首个extent就会被分配,缺省值是 8 页。

  • NEXT SIZE——之后添加到表中每个extent的大小,缺省值是 8 页。

  extent最小为4页 ,extent的大小必须是系统中页大小的偶数倍数。

  如果分配给表的extent数量过多,意外增长达到上限,就会出现问题。我们可以通过计算每行数据的大小以及预估表的总数据行数,来计算分配给表的的extent 大小。

  如果一张表的初始extent大小不够且系统必须分配大量的extent来满足需求时,可以通过使用ALTER TABLE 命令来调整后续增加的extent的大小,不过这不会改变已有的extent。

alter table customer next size 32;   —将customer表下一个extent设置为32K

3. 表的锁定模式

  创建表时可以为表指定行级锁或页级锁。一般情况下,需要设置为行级锁。通常我们会把onconfig配置文件中的参数DEF_TABLE_LOCKMODE设置为ROW,这样建表默认的锁级别就是行级锁。

4. 为要创建的表指定 dbspace

  • 管理和平衡表和数据库的 I/O 要求。
  • 限定表可用的空间数。
  • 将表进行逻辑分组,以增加备份和恢复的粒度。

5. 建表示例

5.1 创建普通表

  • 创建名为orders的表

create table orders(
 customer_num integer,
 order_date date
)
in dbspace1       —表的存放位置
extent size 64      —表创建时分配的extent大小
next size 32       —extent空间使用完后下一个分配的extent大小
lock mode row;      —锁级别

5.2 创建简单大对象表

  • 创建名为evaluation含有简单大对象字段表,并将简单大对象字段部分存放于独立blobspace上

create table evaluation(
 employee_num serial,
 manager_num integer,
 emp_eval_form text in blobspace1,   —列字段类型与存放位置
 emp_picture byte in blobspace2    —列字段类型与存放位置
)
in dbspace2;

5.3 创建智能大对象表

  • 创建表名为movie的含有只能大对象字段表, 并将只能大对象字段部分存放于独立smartblobspace上

create table movie(
 movie_num integer,
 movie_title char(50),
 video blob,
 audio blob,
 description clob  —指定列字段类型为clob
)
put video in (sbdbs1),   —指定字段video的存放位置
audio in (sbdbs2),     —指定audio的存放位置
description in (sbdbs3);   —指定description的存放位置

5.4 创建临时表

  • 创建名为temp_order的临时表,不记日志

create temp table temp_order(
 order_num integer
)
with no log;     —指定无日志模式

  • 将customer中两个字段插入临时表cust_temp,不记日志

select customer_num, company from customer
into temp cust_temp
with no log;     —指定无日志模式

6. 系统目录表systables

  systables系统目录表会为每张表、视图和 synonym 保留一行信息。需要关注的字段有:

  • tabname——表名
  • tabid——唯一的数字表标识符(用在其他系统目录表去引用表)
  • rowsize——以字节为单位的数据行的大小

  表名只存储在systables 表里。 systables 表的一个重要作用是提供表名和 tabid 之间的连接。tabid是按顺序指派的 ,且是唯一的。系统目录表在 1 和 99 之间编号;用户自定义的表的 tabid 值大于或等于 100。
  systables中的partnum 字段等同于在 onstat 输出里的 tblspace 编号 (tblsnum)。 tblsnum 是十六进制格式的 partnum 值。可通过以下语句进行查询:

select tabname, hex(partnum) from systables;