当前位置:   article > 正文

达梦数据库中表的类型及使用_达梦数据类型

达梦数据类型

1.表类型

达梦数据库支持的表类型有:普通表、堆表、列存储表(HUGE)、分区表、临时表、外部表等。

2.普通表

即索引组织表,也是达梦默认创建的表,有且仅有一个聚簇索引键,表数据按照聚簇索引键排序,数据是有序的,插入有序,rowid 是逻辑 rowid,占用存储空间,所以索引组织表比堆表占用较多空间。
DM 创建表时如果指定了主键,则主键为聚簇索引键;如果创建表示未指定主键,则 rowid 为聚簇索引键。

如果要在所属模式中创建新表,需要有 CREATE TABLE 数据库权限;而要在其他用户的模式中创建新表,则需要有 CREATE ANY TABLE 数据库权限。创建表时,应当为表指定一个表空间,否则,表将默认在 MAIN 创建

SQL>  CREATE  TABLE  EMPLOYEE (

    EMPNO INT PRIMARY KEY,

    ENAME       VARCHAR(15)     NOT NULL,

    JOB                 VARCHAR(10),

    MGR                 INT,

    HIREDATE    DATE    DEFAULT (SYSDATE),

    SALARY              FLOAT,

    DEPTNO      TINYINT  NOT NULL )

    STORAGE (

    INITIAL    50,

    NEXT     50,

    MINEXTENTS    10,

    FILLFACTOR   80,

    ON  USERS)

 /

操作已执行

已用时间: 11.761(毫秒). 执行号:701.

初始簇数目INITIAL:指建立表时分配的簇个数,必须为整数,最小值为1,最大值为256,缺省为1;

下次分配簇数目NEXT:指当表空间不够时,从数据文件中分配的簇个数,必须为整数,最小值为 1,最大值为 256,缺省为 1;

最小保留簇数目MINEXTENTS:当删除表中的记录后,如果表使用的簇数目小于这个值,就不再释放表空间,必须为整数,最小值为 1,最大值为 256,缺省为 1;

填充比例 FILLFACTOR:指定插入数据时数据页的充满程度,取值范围从 0 到 100。默认值为 0,等价于 100,表示全满填充,未充满的空间可供页内的数据更新时使用。插入数据时填充比例的值越低,可由新数据使用的空间就越多;更新数据时填充比例的值越大,更新导致出现的页分裂的几率越大;

表空间名:在指定的表空间上建表或索引,表空间必须已存在,默认为用户缺省的表空间。

SQL> CALL SP_TABLEDEF('SYSDBA', 'EMPLOYEE');

行号     COLUMN_VALUE

1          CREATE TABLE "SYSDBA"."EMPLOYEE"  (  "EMPNO" INT NOT NULL,  "ENAME" VARCHAR(15) NOT NULL,  "JOB" VARCHAR(10),  "MGR" INT,  "HIREDATE" DATE DEFAULT SYSDATE,  "SALARY" FLOAT,  "DEPTNO" TINYINT NOT NULL,  NOT CLUSTER PRIMARY KEY("EMPNO")) STORAGE(INITIAL 50, NEXT 50, MINEXTENTS 10, FILLFACTOR 80, ON "USERS", CLUSTERBTR) ;

查看表的建表语句

为了满足用户在建立应用系统的过程中需要调整数据库结构的要求,DM 系统提供表修 

改语句。可对表的结构进行全面的修改,包括修改表名、列名、增加列、删除列、修改列类

型、增加表级约束、删除表级约束、设置列缺省值、设置触发器状态等一系列修改。

SQL> ALTER TABLE EMPLOYEE MODIFY ENAME VARCHAR(29) DEFAULT '' NOT NULL;

操作已执行

已用时间: 21.260(毫秒). 执行号:703.

修改ENAME字段长度以及默认值

SQL> ALTER TABLE EMPLOYEE ADD GENDER CHAR(1) CHECK (GENDER IN ('M','F'));

操作已执行

已用时间: 19.941(毫秒). 执行号:704.

SQL> DESC EMPLOYEE;

行号     NAME     TYPE$       NULLABLE

---------- -------- ----------- --------

1          EMPNO    INTEGER     N

2          ENAME    VARCHAR(29) N

3          JOB      VARCHAR(10) Y

4          MGR      INTEGER     Y

5          HIREDATE DATE        Y

6          SALARY   DOUBLE      Y

7          DEPTNO   TINYINT     N

8          GENDER   CHAR(1)     Y

8 rows got

增加GENDER列,以及CHECK约束

已用时间: 20.952(毫秒). 执行号:705.

SQL> ALTER TABLE EMPLOYEE DROP GENDER CASCADE;

操作已执行

已用时间: 27.677(毫秒). 执行号:706.

SQL> DESC EMPLOYEE;

行号     NAME     TYPE$       NULLABLE

---------- -------- ----------- --------

1          EMPNO    INTEGER     N

2          ENAME    VARCHAR(29) N

3          JOB      VARCHAR(10) Y

4          MGR      INTEGER     Y

5          HIREDATE DATE        Y

6          SALARY   DOUBLE      Y

7          DEPTNO   TINYINT     N

7 rows got

已用时间: 1.572(毫秒). 执行号:707.

删除列GENDER

SQL> TRUNCATE TABLE EMPLOYEE;

操作已执行

已用时间: 11.839(毫秒). 执行号:716.

清空表

SQL> DROP TABLE EMPLOYEE;

操作已执行

已用时间: 34.060(毫秒). 执行号:717.

删除表

3.堆表

ORACLE默认建表为堆表。

普通表都是以 B 树形式存放的,ROWID 都是逻辑的 ROWID,即从 1 一直增长下去。在并发情况下,每次插入过程中都需要逻辑生成 ROWID,这样影响了插入数据的效率;对于每一条数据都需要存储 ROWID 值,也会花费较大的存储空间。堆表就是基于上述两个理由而提出的。简单地说,堆表是指采用了物理 ROWID 形式的表,即使用文件号、页号和页内偏移而得到 ROWID 值,这样就不需要存储 ROWID 值,可以节省空间。逻辑 ROWID 在插入或修改过程中,为了确保 ROWID 的唯一性,需要依次累加而得到值,这样就影响了效率,而堆表只需根据自己的文件号、页号和页内偏移就可以得到 ROWID,提高了效率。

堆表的创建有两种方式,一种是采用在配置文件 dm.ini 中设置参数LIST_TABLE,一种是在建表语句中显式指定堆表选项。
在配置文件 dm.ini,如果 LIST_TABLE = 1,则在未显式指定表是否为堆表或非堆表时,默认情况下创建的表为堆表;如果LIST_TABLE = 0,则在未显式指定表是否为堆表或非堆表时,默认情况下创建的表为普通表形式。
与堆表创建形式相关的关键字有三个,分别是 NOBRANCH、BRANCH、CLUSTERBTR。

用法如下:

  1. NOBRANCH:如果指定为 NOBRANCH,则创建的表为堆表,并发分支个数为 0,非并发分支个数为 1;
    2)BRANCH(N,M):如果为该形式,则创建的表为堆表,并发分支个数为 N,非并发个数为 M;
    3)BRANCH N:指定创建的表为堆表,并发分支个数为 N,非并发分支个数为 1;
    4)CLUSTERBTR:创建的表为非堆表,即普通 B 树表。

SQL>  CREATE  TABLE  EMPLOYEE_B (

    EMPNO INT PRIMARY KEY,

    ENAME       VARCHAR(15)     NOT NULL,

    JOB                 VARCHAR(10),

    MGR                 INT,

    HIREDATE    DATE    DEFAULT (SYSDATE),

    SALARY              NUMBER(10,3),

    DEPTNO      TINYINT  NOT NULL )

    STORAGE (

    INITIAL     50,

    NEXT   50,

    MINEXTENTS   10,

    FILLFACTOR   80,

    ON  USERS,

    BRANCH (2,4))

  /

操作已执行

已用时间: 15.536(毫秒). 执行号:800.

表EMPLOYEE_B并发分支 2 个,非并发分支 4 个。

堆表不支持聚集索引和列存储:

堆表采用了物理 ROWID,即通过文件号、页号和页内偏移直接生成该值。这样如果我们知道了 ROWID 值,也就知道文件号、页号和页内偏移这些变量,就可以直接定位到某条记录,所以没有必要再为堆表创建聚集索引了。在创建堆表时,系统会默认创建聚集索引,该索引只是一个根页信息。显式建立聚集索引是不允许的,如果用户需要借助聚集索引主键对数据进行排序则不推荐使用堆表。

由于列存储采用了不同方式对表进行物理存储, DM 服务器暂时不支持堆表的列存储。

SQL> ALTER TABLE EMPLOYEE_B MODIFY ENAME VARCHAR(29) DEFAULT '' NOT NULL;

操作已执行

已用时间: 21.995(毫秒). 执行号:801.

SQL> ALTER TABLE EMPLOYEE_B ADD GENDER CHAR(1) CHECK (GENDER IN ('M','F'));

操作已执行

已用时间: 19.916(毫秒). 执行号:802.

SQL> DESC EMPLOYEE_B;

行号     NAME     TYPE$       NULLABLE

---------- -------- ----------- --------

1          EMPNO    INTEGER     N

2          ENAME    VARCHAR(29) N

3          JOB      VARCHAR(10) Y

4          MGR      INTEGER     Y

5          HIREDATE DATE        Y

6          SALARY   DEC(10, 3)  Y

7          DEPTNO   TINYINT     N

8          GENDER   CHAR(1)     Y

8 rows got

已用时间: 10.558(毫秒). 执行号:803.

SQL> ALTER TABLE EMPLOYEE_B DROP GENDER CASCADE;

操作已执行

已用时间: 26.568(毫秒). 执行号:804.

SQL> DESC EMPLOYEE_B;

行号     NAME     TYPE$       NULLABLE

---------- -------- ----------- --------

1          EMPNO    INTEGER     N

2          ENAME    VARCHAR(29) N

3          JOB      VARCHAR(10) Y

4          MGR      INTEGER     Y

5          HIREDATE DATE        Y

6          SALARY   DEC(10, 3)  Y

7          DEPTNO   TINYINT     N

7 rows got

已用时间: 1.816(毫秒). 执行号:805.

修改堆表语句与普通表一致。

4.列存储表(HUGE)

达梦数据库中,表的数据存储方式分为行存储和列存储。行存储是以记录为单位进行存

储的,数据页面中存储的是完整的若干条记录;列存储是以列为单位进行存储的,每一个列

的所有行数据都存储在一起,而且一个指定的页面中存储的都是某一个列的连续数据。

Huge File System(检查 HFS)是达梦数据库实现的,针对海量数据进行分析的一种高效、简单的列存储机制。列存储表(也称为 HUGE 表)就是建立在 HFS 存储机制上的一种表。

HUGE 表是建立在混合表空间上的。HUGE 数据文件存储在混合表空间定义中指定的

HUGE 数据文件路径下,一个混合表空间最多可以添加 255 个 HUGE 数据文件路径,混合表空间的 HUGE 数据文件路径相关信息存储在动态视图 V$HUGE_TABLESPACE 中。

普通的表空间,数据是通过段、簇、页来管理的,并且以固定大小(4K8K16K32K)的页面为管理单位;而混合表空间存储 HUGE 表是通过 HFS 存储机制来管理的,它相当于一个文件系统。为混合表空间指定一个 HUGE 数据文件路径,其实就是创建一个空的HUGE 数据文件目录(系统中有一个默认的混合表空间 MAIN,其 HUGE 数据文件目录名为HMAIN)。在创建一个HUGE 表并插入数据时,数据库会在指定的混合表空间的 HUGE 数据文件目录下创建一系列的目录及文件。

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

非事务型 HUGE 表:

对非事务型 HUGE 表的增、删、改是直接对 HUGE 表进行写操作的,不写 UNDO 日志,

不通过 BUFFER 缓存,直接操纵文件,速度快,但也因此导致不支持事务。为了保证数据的一致性,在操作时可以适当地做一些日志来保证数据的完整性,完整性保证策略主要是通过数据的镜像来实现的,镜像的不同程度可以实现不同程度的完整性恢复。

DM 对于镜像提供三种方案:

1. LOG NONE:不做镜像。相当于不做数据一致性的保证,如果出错只能手动通过系

统函数来修复表数据,当然速度是最快的,不需要额外的 IO,如果用户明确知道

自己的环境不会出现问题可以采用该方案,效率最高。

2. LOG LAST:做部分镜像。但是在任何时候都只对当前操作的区做镜像,如果当前

区的操作完成了,那么这个镜像也就失效了,可能会被下一个被操作区覆盖。这样

做的好处是镜像文件不会太大,同时也可以保证数据是完整的。但有可能遇到的问

题是:一次操作很多的情况下,有可能一部分数据做镜像已经完成,另一部分数据

还没有来得及开始做的问题。如果用户能接受这个问题的话这个选择不失为最佳选

择,这也是系统默认的选择。

3. LOG ALL:全部做镜像。在操作过程中,所有被修改的区都会被记录下来,当一

次操作修改的数据过多时,镜像文件有可能会很大,但好处是,能够保证操作完整

性。比如,在操作过程中失败了,那么这个操作会完整的撤消,不存在 LOG LAST 

方案中一部分修改部分还没修改的问题。

需要注意的是,若创建数据库时使用参数 HUGE_WITH_DELTA 的缺省值 ,则不支持

创建非事务型 HUGE 表。

事务型 HUGE 表:

非事务型 HUGE 表在进行增、删、改时直接对 HUGE 表进行写操作,每次写操作需要至

少对一个区进行 IO,导致 IO 量较大,且并发性能不高。

为此,DM 推出了事务型 HUGE 表,通过增加 RAUXDAUX 和 UAUX 行辅助表,减少了

事务型 HUGE 表增、删、改操作的 IO,提高效率,同时提高并行性能。事务型 HUGE 表支持 UNDO 日志,实现了事务特性。

创建一个 HUGE 表时,如果不使用默认的表空间,则必须要先创建一个混合表空间。

[dmdba@dataguard-pri bin]$ ./dminit PATH=/dm/data/ INSTANCE_NAME=GRP1_LOCAL_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CHARSET=1 LENGTH_IN_CHAR=1 HUGE_WITH_DELTA=0 RLOG_GEN_FOR_HUGE=0 AUTO_OVERWRITE=2

重新初始化数据库,以便于支持创建非事务性HUGE表

SQL> CREATE TABLESPACE TS1 DATAFILE '/dm/data/DAMENG/TS1/TS1.dbf' SIZE 128 WITH HUGE PATH '/dm/data/DAMENG/TS1/HUGE1';

操作已执行

已用时间: 116.605(毫秒). 执行号:808.

创建一个混合表空间,指定HUGE数据文件路径 /dm/data/DAMENG/TS1/HUGE1

SQL> CREATE TABLESPACE TS1 DATAFILE '/dm/data/DAMENG/TS1/TS1.dbf' SIZE 128 WITH HUGE PATH '/dm/data/DAMENG/TS1/HUGE1';

操作已执行

已用时间: 98.689(毫秒). 执行号:59400.

SQL>     CREATE HUGE TABLE ORDERS

    (

        O_ORDERKEY              INT,

        O_CUSTKEY               INT,

        O_ORDERSTATUS                   CHAR(1),

        O_TOTALPRICE                    FLOAT,

        O_ORDERDATE             DATE,

        O_ORDERPRIORITY                 CHAR(15),

        O_CLERK                 CHAR(15),

        O_SHIPPRIORITY                  INT,

        O_COMMENT               VARCHAR(79)

     )STORAGE(ON TS1,WITHOUT DELTA)

     /

操作已执行

已用时间: 16.322(毫秒). 执行号:59401.

创建非事务型HUGE表ORDERS,并放在TS1混合表空间

SQL> CREATE HUGE TABLE ORDERS1

(

    O_ORDERKEY                  INT,

    O_CUSTKEY                   INT,

    O_ORDERSTATUS                       CHAR(1),

    O_TOTALPRICE                        FLOAT,

    O_ORDERDATE                 DATE,

    O_ORDERPRIORITY                     CHAR(15),

    O_CLERK                     CHAR(15),

    O_SHIPPRIORITY                      INT,

    O_COMMENT                   VARCHAR(79)

 )STORAGE(ON TS1,WITH DELTA)

 /

操作已执行

已用时间: 21.224(毫秒). 执行号:59402.

创建非事务型HUGE表ORDERS1,并放在TS1混合表空间

SQL> ALTER TABLE ORDERS1 MODIFY O_ORDERPRIORITY CHAR(20);

操作已执行

已用时间: 23.160(毫秒). 执行号:59403.

HUGE表修改字段长度

SQL> ALTER TABLE ORDERS1 ADD COL1 CHAR(1);

操作已执行

已用时间: 60.543(毫秒). 执行号:59404.

HUGE表增加新列

SQL> ALTER TABLE ORDERS1 DROP COL1 CASCADE;

操作已执行

HUGE表删除列

HUGE 表与普通行表一样,可以进行增、删、改操作,操作方式也是一样的。但 HUGE表的删除与更新操作的效率会比行表低一些,并发操作性能也会比行表差一些,因此在HUGE中不宜做频繁的删除及更新操作。总之,HUGE 表比较适合做分析型表的存储。

另外,使用 HUGE 表时应注意存在以下一些限制:

1.建 HUGE 表时仅支持定义 NULL、NOT NULL、UNIQUE 约束以及 PRIMARY KEY。

后两种约束也可以通过 ALTER TABLE 的方式添加,但这两种约束不检查唯一性,用户需要确保实际数据符合约束,否则相关操作的结果可能不符合预期;

2.HUGE 不允许建立聚集索引,允许建立二级索引,不支持建位图索引,其中 UNIQUE

索引不检查唯一性;

3.不支持 SPACE LIMIT(空间限制);

4.不支持建立全文索引;

5.不支持使用自定义类型;

6.不支持引用约束;

7.不支持 IDENTITY 自增列;

8.不支持大字段列;

9.不支持建触发器;

10.不支持游标的修改操作;

11.PK 和 UNIQUE 约束不检查唯一性,对应的索引都为虚索引;UNIQUE 索引也不检查唯一性,为实索引,索引标记中不包含唯一性标记,即和普通二级索引相同;

12.不允许对分区子表设置 SECTION 和 WITH/WITHOUT DELTA;

13.当事务型 HUGE 表进行了较多增删改操作时,应对其进行数据重整操作,以提高性能。

5.分区表

分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。一个表被分区后,对表的查询操作可以局限于某个分区进行,而不是整

个表,这样可以大大提高查询速度。

在 DM 分区表中,主表本身不存储数据,所有数据只存储在子表中,从而实现不同分区的完全独立性。 

水平分区子表删除后,会将子表上的数据一起删除。

由于每一个分区都以一个子表作为实体,那么不同分区可以存储于相同表空间,也可以位于不同的表空间中。将这些分区放在不同的表空间中具有以下的好处:

1. 减少所有数据都损坏的可能性,一个表空间损坏不影响其他表空间,提高可用性;

2. 恢复时间大大减少;

3. 可以将同一个表中的数据分布在不同的磁盘上,从而均衡磁盘上的 I/O 操作;

4. 提高了表的可管理性、可利用性和访问效率。

达梦数据库 DM 支持对表进行水平分区。对于水平分区,提供以下分区方式:

1. 范围(range)水平分区:对表中的某些列上值的范围进行分区,根据某个值的范

围,决定将该数据存储在哪个分区上;

2. 哈希(hash)水平分区:通过指定分区编号来均匀分布数据的一种分区类型,通

过在 I/O 设备上进行散列分区,使得这些分区大小基本一致;

3. 列表(list)水平分区:通过指定表中的某个列的离散值集,来确定应当存储在

一起的数据。例如,可以对表上的 status 列的值在('A','H','O')放在一个

分区,值在('B','I','P')放在另一个分区,以此类推;

4. 多级分区表:按上述三种分区方法进行任意组合,将表进行多次分区,称为多级分

区表。

范围分区表

SQL> CREATE TABLE EMP

(

   EMPLOYEE_ID      INT,

   EMPLOYEE_NAME    VARCHAR (20),

   IDENTITY_CARD    VARCHAR (18),

   EMAIL            VARCHAR (50) NOT NULL,

   PHONE_NUM        VARCHAR (20),

   HIRE_DATE        DATE NOT NULL,

   JOB_ID           VARCHAR (10) NOT NULL,

   SALARY           INT,

   COMMISSION_PCT   INT,

   MANAGER_ID       INT,

   DEPARTMENT_ID    INT,

   CHECK (SALARY > 0)

)

PARTITION BY RANGE (HIRE_DATE)

   (PARTITION P1 VALUES LESS THAN ('2015-01-01') TABLESPACE TBS_P1,

  PARTITION P2 VALUES LESS THAN ('2018-01-01') TABLESPACE TBS_P2,

  PARTITION P3 VALUES LESS THAN ('2021-01-01') TABLESPACE TBS_P3,

  PARTITION PMAX VALUES LESS THAN (MAXVALUE) TABLESPACE TBS_PMAX)

/

操作已执行

已用时间: 21.482(毫秒). 执行号:59705.

创建范围分区表,以HIRE_DATE作为分区列

哈希分区表

SQL> CREATE TABLE sales01(

sales_id INT,

saleman CHAR(20),

saledate DATETIME,

city CHAR(10)

)

PARTITION BY HASH(city)(

PARTITION p1,

PARTITION p2,

PARTITION p3,

PARTITION p4

)

 /

操作已执行

已用时间: 23.561(毫秒). 执行号:59601.

创建以city列作为分区键值的HASH分区表

列表分区表

SQL> 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)

)

/

操作已执行

已用时间: 27.767(毫秒). 执行号:59604.

创建列表分区表,以city作为分区键值。

多级分区表

SQL> CREATE TABLE SALES1(

SALES_ID INT,

SALEMAN CHAR(20),

SALEDATE DATETIME,

CITY CHAR(10)

)

PARTITION BY LIST(CITY)

SUBPARTITION BY RANGE(SALEDATE) SUBPARTITION TEMPLATE(

SUBPARTITION P11 VALUES LESS THAN ('2023-04-01'),

SUBPARTITION P12 VALUES LESS THAN ('2023-07-01'),

SUBPARTITION P13 VALUES LESS THAN ('2023-10-01'),

SUBPARTITION P14 VALUES EQU OR LESS THAN (MAXVALUE))

(

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

(

 SUBPARTITION P11_1 VALUES LESS THAN ('2023-10-01'),

 SUBPARTITION P11_2 VALUES EQU OR LESS THAN (MAXVALUE)

),

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

PARTITION P3 VALUES (DEFAULT)

)

/

操作已执行

已用时间: 39.033(毫秒). 执行号:59605.

创建多级分区表,按照CITYSALEDATE进行分区

6.临时表

当处理复杂的查询或事务时,由于在数据写入永久表之前需要暂时存储一些行信息或需要保存查询的中间结果,可能需要一些表来临时存储这些数据。DM 允许创建临时表来保存会话甚至事务中的数据。在会话或事务结束时,这些表上的数据将会被自动清除。临时表中的数据不能像在其它永久表中的数据那样进行备份,当事务结束或会话断开时,数据就会被清空。在临时表创建过程中,不会像永久表和索引那样自动分配数据段,而是仅当第一次执行 DML 语句时,才会为临时表在临时表空间中分配空间。并且,对于不同的会话,临时表上的数据是独享的,不会互相干扰,即会话 A 不能访问会话 B 临时表上的数据。

DM 临时表支持以下功能:

  1. 在临时表中,会话可以像普通永久表一样更新、插入和删除数据;
  2. 临时表的 DML 操作产生较少的 REDO 日志;
  3. 临时表支持建索引,以提高查询性能;
  4. 在一个会话或事务结束后,数据将自动从临时表中删除;
  5. 不同用户可以访问相同的临时表,每个用户只能看到自己的数据;
  6. 临时表的数据量很少,意味着更高效的查询效率;
  7. 临时表的表结构在数据删除后仍然存在,便于以后的使用;

临时表的权限管理跟普通表一致。

临时表 ON COMMIT 关键词指定表中的数据是事务级还是或会话级的,默认情况下是事务级的。

ON COMMIT DELETE ROWS:指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除;

ON COMMIT PRESERVE ROWS:指定临时表是会话级的,会话结束时才清空表,并释放临时 B 树。

事务级临时表

SQL> CREATE GLOBAL TEMPORARY TABLE TMP_EMP(

    EMPNO       INT             PRIMARY KEY,

    ENAME       VARCHAR(15)     NOT NULL,

    JOB         VARCHAR(10))

  ON COMMIT DELETE ROWS;

2   3   4   5   操作已执行

已用时间: 11.355(毫秒). 执行号:59706.

SQL> INSERT INTO TMP_EMP VALUES (1,'LOU','DBA');

影响行数 1

已用时间: 1.069(毫秒). 执行号:59707.

SQL> INSERT INTO TMP_EMP VALUES (2,'LOU','DBA');

影响行数 1

已用时间: 0.470(毫秒). 执行号:59708.

SQL> SELECT * FROM TMP_EMP;

行号     EMPNO       ENAME JOB

---------- ----------- ----- ---

1          1           LOU   DBA

2          2           LOU   DBA

已用时间: 0.706(毫秒). 执行号:59709.

SQL> COMMIT;

操作已执行

已用时间: 3.867(毫秒). 执行号:59710.

SQL> SELECT * FROM TMP_EMP;

未选定行

已用时间: 0.261(毫秒). 执行号:59711.

提交后临时表被清空。

SQL> DESC TMP_EMP;

行号     NAME  TYPE$       NULLABLE

---------- ----- ----------- --------

1          EMPNO INTEGER     N

2          ENAME VARCHAR(15) N

3          JOB   VARCHAR(10) Y

已用时间: 10.540(毫秒). 执行号:59712.

但是表还在。

会话级临时表

SQL> CREATE GLOBAL TEMPORARY TABLE TMP_EMP1(

    EMPNO       INT             PRIMARY KEY,

    ENAME       VARCHAR(15)     NOT NULL,

    JOB         VARCHAR(10))

ON COMMIT PRESERVE ROWS ;

2   3   4   5   操作已执行

已用时间: 9.746(毫秒). 执行号:59713.

SQL> INSERT INTO TMP_EMP1 VALUES (1,'LOU','DBA');

影响行数 1

已用时间: 1.475(毫秒). 执行号:59714.

SQL> INSERT INTO TMP_EMP1 VALUES (2,'LOU','DBA');

影响行数 1

已用时间: 1.160(毫秒). 执行号:59715.

SQL> SELECT * FROM TMP_EMP1;

行号     EMPNO       ENAME JOB

---------- ----------- ----- ---

1          1           LOU   DBA

2          2           LOU   DBA

已用时间: 0.588(毫秒). 执行号:59716.

SQL> COMMIT;

操作已执行

已用时间: 0.963(毫秒). 执行号:59717.

SQL> SELECT * FROM TMP_EMP1;

行号     EMPNO       ENAME JOB

---------- ----------- ----- ---

1          1           LOU   DBA

2          2           LOU   DBA

已用时间: 0.347(毫秒). 执行号:59718.

发生了事务临时表还在

SQL> exit

[dmdba@dataguard-pri bin]$ ./disql SYSDBA/SYSDBA@LOCALHOST:5236

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间 : 2.473(ms)

disql V8

SQL> SELECT * FROM TMP_EMP1;

未选定行

已用时间: 0.983(毫秒). 执行号:59900.

SQL> DESC TMP_EMP1;

行号     NAME  TYPE$       NULLABLE

---------- ----- ----------- --------

1          EMPNO INTEGER     N

2          ENAME VARCHAR(15) N

3          JOB   VARCHAR(10) Y

已用时间: 10.775(毫秒). 执行号:59901.

退出会话后重新开启新的会话,临时表数据被清空,但是表还在。

7.外部表

外部表是表的数据不会放在数据库里面,会放在操作系统的文件里面。通过数据库外部表可以查看外部文件的数据。

1、建立外部表时,不会产生页、簇、段等存储结构;

2、只能与表相关的定义放在数据库字典中,不能对外部表的内容进行修改(update、instert、 delete);

3、不能对外部表创建索引;

4、外部表可以通过SQL语句解码器来完成。而不需要将外部表装载到数据库中;

系统中有数据文本文件如下,为此文件创建外部表。

[dmdba@dataguard-pri DAMENG]$ cat /tmp/ext_table/data.txt

10|9|7|2

4|3|2|5

编写控制文件/tmp/ext_table/ctrl.txt

[dmdba@dataguard-pri DAMENG]$ cat /tmp/ext_table/ctrl.txt

LOAD DATA

INFILE 'data.txt'

INTO TABLE EXT

FIELDS '|'

创建目录对象

SQL> CREATE OR REPLACE DIRECTORY "EXTDIR" AS '/tmp/ext_table/';

操作已执行

已用时间: 9.447(毫秒). 执行号:59902.

SQL> CREATE EXTERNAL TABLE EXT_TABLE(

C1 INT,

C2 INT,

C3 INT,

C4 INT

) FROM DEFAULT DIRECTORY EXTDIR LOCATION ('ctrl.txt');2   3   4   5   6

操作已执行

已用时间: 26.489(毫秒). 执行号:59903.

创建外部表

SQL> SELECT * FROM EXT_TABLE;

行号     C1          C2          C3          C4

---------- ----------- ----------- ----------- -----------

1          10          9           7           2

2          4           3           2           5

已用时间: 7.861(毫秒). 执行号:59904.

查询外部表,外部表创建成功。

SQL> INSERT INTO EXT_TABLE VALUES(2,4,6,8);

INSERT INTO EXT_TABLE VALUES(2,4,6,8);

第1 行附近出现错误[-2609]:外部表不支持的操作.

已用时间: 0.239(毫秒). 执行号:0.

外部表不支持修改操作。

[dmdba@dataguard-pri ext_table]$ cat data.txt

10|9|7|2

4|3|2|5

5|4|5|9

SQL> SELECT * FROM EXT_TABLE;

行号     C1          C2          C3          C4

---------- ----------- ----------- ----------- -----------

1          10          9           7           2

2          4           3           2           5

3          5           4           5           9

已用时间: 2.287(毫秒). 执行号:59905.

在文件中增加行,外部表也会更新新行。

SQL> CREATE TABLE TEST3 AS SELECT * FROM EXT_TABLE;

操作已执行

已用时间: 13.802(毫秒). 执行号:59906.

SQL> SELECT * FROM TEST3;

行号     C1          C2          C3          C4

---------- ----------- ----------- ----------- -----------

1          10          9           7           2

2          4           3           2           5

3          5           4           5           9

已用时间: 0.592(毫秒). 执行号:59907.

可以使用外部表来创建普通表。

8.总结

达梦数据库支持多种表类型,开发人员应根据业务需求来选择表类型,要对业务有合适的预估,提前规划表分区;

HUGE表在海量数据分析有优势,但是在删除和更新方面性能不如行表,在选择使用HUGE表时,应明白这点;

一般情况下,堆表的插入效率优于索引组织表,查询速度索引组织表优于堆表,索引组织表比堆表更节省磁盘空间,使用主键来查询的表比较适合索引组织表。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/531382
推荐阅读
相关标签
  

闽ICP备14008679号