技术编程|openGauss魔改PG?它能兼容Oracle的数据库表吗?( 二 )


1、事务级临时表
此类型的临时表中的数据仅在事务过程中有效 , 当事务提交后 , 临时表中的数据将被自动清除 , 但是临时表的结构以及元数据还存储在用户的数据字典中 。在事务结束后 , 最好显式删除临时表 , 否则数据库会残留临时表的表结构和元数据 。在语句中定义表的字段结构方式创建
postgres=# CREATE GLOBAL TEMPORARY TABLE T_TRANS_TMP
ID NUMBER,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
CREATE TABLE通过select语句的查询结果创建表
postgres=# CREATE GLOBAL TEMPORARY TABLE T_TRANS_TMP ON COMMIT DELETE ROWS
AS
SELECT * FROM TMP_TEST;
INSERT 0 0
2、会话级临时表
会话级临时表中的数据可以跨事务而存在 , 不过当该会话结束时 , 临时表中的数据将随着会话的结束而被丢弃 。与事务级临时表相同 , 在会话结束后 , 会话级临时表的结构以及元数据还存储在用户的数据字典中 , 需显式手动清除 。在语句中定义表的字段结构方式创建
postgres=# CREATE TEMPORARY TABLE T_CONN_TMP
ID NUMBER,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;
CREATE TABLE通过select语句的查询结果创建表
postgres=# CREATE TEMPORARY TABLE T_CONN_TMP ON COMMIT PRESERVE ROWS
AS
SELECT * FROM TMP_TEST;
INSERT 0 0三、表压缩
表压缩是对表数据进行压缩 , 达到节省空间的目的 , 压缩对于数据装载和DML操作有一定的CPU消耗 。然而 , 这些消耗可以为I/O的减少而抵消 。Oracle常用的压缩方式有两种:基础压缩以及OLTP压缩 。
1、基础压缩
基础压缩只在direct path load的时候才会生效 , 对于普通的dml语句insert、update不会发生压缩 , openGauss可以支持基础压缩 。
postgres=# create table t_compress (id number) compress;
CREATE TABLE
2、OLTP压缩
OLTP压缩会对所有的DML生效 , 所以适用于OLTP系统 。只有当新的block中的数据存放到达了阈值的时候才会引发块内的压缩操作 , 然后更多的数据加入到块中 , 再一次达到阈值 , 整个block会重新压缩 , 以达到最大程度的压缩级别 。
这个过程会一直重复 , 直到Oracle数据库确定无法再从压缩上获得更高的效益 。所以多数OLTP事务作用在压缩的块上面 , 会和未压缩的表上拥有相同的性能 。只有部分操作会引发块内的压缩动作 。OLTP压缩功能openGauss目前无法支持 。
postgres=# create table t_oltp_compress (id number) compress for oltp;
ERROR: syntax error at or near "for"
LINE 1: create table t_oltp_compress (id number) compress for oltp;四、索引组织表
索引组织表是以索引的方式保存表的数据 , 数据根据主键的顺序进行排列的 , 这样就提高了访问的速度 。缺点是由于索引块保存所有的字段的信息 , 就需要更多的叶子页面来保存数据 , 数据量较大的时候会造成访问效率降低 。
此外 , 如果主键频繁修改 , 对应的行也就需要磁盘位置频繁修改 , 行需要在不同的块之间相互移动 。通常在以下情况 , 会考虑使用索引组织表:表的宽度(即一行的数据长度)有限;表的主键不会或极少更改;表主要用于查询 , DML操作较少;大部分的业务需求是根据主键查询行中其它列上的信息 。
openGauss目前版本不支持索引组织表 , 对于应用程序来说 , 索引组织表的使用方式与堆表并无差异 。
postgres=# CREATE TABLE T_ORG_INDEX
(
ID NUMBER,
NAME VARCHAR2(32),
PRIMARY KEY(ID)
)organization index;
ERROR: syntax error at or near "organization index"
LINE 6: )organization index;五、簇表


推荐阅读