返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

表设计
总体上讲,良好的表设计需要遵循以下原则:

【关注】减少需要扫描的数据量。通过分区表的剪枝机制可以大幅减少数据的扫描量。

【关注】尽量减少随机I/O。通过聚簇/局部聚簇可以实现热数据的连续存储,将
随机
I/O 转换为连续I/O,从而减少扫描的I/O 代价。
选择存储方案
【建议】
表的存储类型是表定义设计的第一步,
客户业务类型是决定表的存储类型的主
要因素,表存储类型的选择依据请参考表4-1。
表4- 1 表的存储类型及场景
存储类型
适用场景
行存

点查询(返回记录少,基于索引的简单查询)。

增、删、改操作较多的场景。
列存

统计分析类查询(关联、分组操作较多的场景)。

即席查询(查询条件不确定,行存表扫描难以使用索引)。
选择分区方案
当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则:

【建议】使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。

【建议】分区名称应当体现分区的数据特征。例如,关键字+区间特征。

【建议】将分区上边界的分区值定义为MAXVALUE,以防止可能出现的数据溢出。
表4- 2 表的分区方式及使用场景
分区方式
描述
Range
表数据通过范围进行分区。
Interval
表数据通过范围进行分区,
超出范围的会自动根据间隔创建新的分区。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
49
List
表数据通过指定列按照具体值进行分区。
Hash
表数据通过Hash 散列方式进行分区。
典型的分区表定义如下:
--创建Range 分区表
CREATE TABLE staffS_p1 (
staff_ID
NUMBER(6) not null, FIRST_NAME
VARCHAR2(20), LAST_NAME
VARCHAR2(25), EMAIL
VARCHAR2(25), PHONE_NUMBER VARCHAR2(20),
HIRE_DATE
DATE,
employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(4,2),
MANAGER_ID NUMBER(6),
section_ID NUMBER(4)
)
PARTITION BY RANGE (HIRE_DATE) (
PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'), PARTITION
HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'), PARTITION HIRE_maxvalue
VALUES LESS THAN (MAXVALUE)
);
--创建Interval 分区表,初始两个分区,插入分区范围外的数据会自动新增分区CREATE
TABLE sales
(prod_id NUMBER(6), cust_id NUMBER, time_id DATE, channel_id CHAR(1), promo_id
NUMBER(6),
quantity_sold NUMBER(3), amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id) INTERVAL('1 day')
( PARTITION p1 VALUES LESS THAN ('2019-02-01 00:00:00'), PARTITION p2 VALUES LESS
THAN ('2019-02-02 00:00:00')
);
--创建List 分区表
CREATE TABLE test_list (col1 int, col2 int) partition by list(col1)
(
partition p1 values (2000), partition p2 values (3000), partition p3 values (4000),
partition p4 values (5000)
);
--创建Hash 分区表
CREATE TABLE test_hash (col1 int, col2 int) partition by hash(col1)
(
partition p1, partition p2
);

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
50
更多的表分区语法信息,参见《GBase 8c V5_3.0.0_SQL 手册》中CREATE TABLE
PARTITION 章节。

示例
示例1:导出.gz 格式文件。
示例中所用的表及数据:
DROP TABLE IF EXISTS gs;
CREATE TABLE gs (a int DEFAULT NULL, b varchar(20) DEFAULT
NULL);
INSERT INTO gs values(1,'qwer'),(2,'asdf');
导出SQL 语句:
gbase> SELECT * FROM gs INTO OUTFILE '/home/gbase/temp/gs_g.gz'
WRITEMODE BY NORMAL;
Query OK, 2 rows affected
查看导出文件:
$ ll
gs_g.gz
示例2:导出.snappy 格式文件。
示例中所用的表及数据:
DROP TABLE IF EXISTS gs;
CREATE TABLE gs (a int DEFAULT NULL, b varchar(20) DEFAULT
NULL);
INSERT INTO gs values(1,'qwer'),(2,'asdf');
导出SQL 语句:
gbase>
SELECT
*
FROM
gs
INTO
OUTFILE
'/home/gbase/temp/gs_g.snappy' WRITEMODE BY NORMAL;
Query OK, 2 rows affected
查看导出文件:
$ ll
gs_g.snappy
示例3:导出.lzo 格式文件。
示例中所用的表及数据:
DROP TABLE IF EXISTS gs;
CREATE TABLE gs (a int DEFAULT NULL, b varchar(20) DEFAULT
NULL);
INSERT INTO gs values(1,'qwer'),(2,'asdf');
导出SQL 语句:
gbase> SELECT * FROM gs INTO OUTFILE '/home/gbase/temp/gs_g.lzo'

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1248
WRITEMODE BY NORMAL;
Query OK, 2 rows affected
查看导出文件:
$ ll
gs_g.lzo

返回值

如果以一个参数调用,它返回X 的自然对数;

这个函数同LN(X)具有相同意义。
示例
示例1
返回2 的自然对数。
gbase> SELECT LOG(2) FROM t;
+-------------------+
| LOG(2) |
+-------------------+
| 0.693147180559945 |
+-------------------+
1 row in set
示例2
返回-2 的自然对数。
gbase> SELECT LOG(-2) FROM t;
+---------+
| LOG(-2) |
+---------+
| NULL |
+---------+
1 row in set
示例3
如果以两个参数调用,这个函数返回以B 为底,X 的对数。
gbase> SELECT LOG(2,65536) FROM t;
+--------------+
| LOG(2,65536) |
+--------------+
| 16 |
+--------------+
1 row in set
示例4
LOG(B,X)等同于LOG(X)/LOG(B)。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 829
gbase> SELECT LOG(1,100) FROM t;
+------------+
| LOG(1,100) |
+------------+
| NULL |
+------------+
1 row in set

注意
输入非法数值后,返回NULL,ORACLE 引擎报错。