CREATE
CREATE 用于创建新的数据库或者表。
CREATE DATABASE
Syntax
创建新数据库:
CREATE DATABASE [IF NOT EXISTS] db_name [WITH <options>]
如果 db_name 数据库已经存在,CREATE 语句的行为如下:
- 不会创建新的数据库。
- 当
IF NOT EXISTS子句被指定时,不会返回错误。 - 否则,返回错误。
数据库也可以通过使用 WITH 关键字配置与 CREATE TABLE 语句类似的选项。数据库支持以下选项:
ttl- 数据库中所有表的数据存活时间(不能设置为instant)memtable.type- 内存表类型(time_series、partition_tree)append_mode- 数据库中的表是否为仅追加模式(true/false)merge_mode- 合并重复行的策略(last_row、last_non_null)skip_wal- 是否为数据库中的表禁用预写日志('true'/'false')sst_format- 数据库中表的 SST(Sorted String Table)文件格式(flat、primary_key)compaction.*- 压缩相关设置(如compaction.type、compaction.twcs.time_window)
阅读更多关于表选项的信息。
数据库选项的行为有所不同:
-
TTL 和 Compaction 选项(
ttl、compaction.*):这些选项具有持续影响。没有指定这些值的表会持续继承数据库级别的值。更改数据库 TTL 或 compaction 选项会立即影响所有没有明确自行设置这些选项的表。 -
其他选项(
memtable.type、append_mode、merge_mode、skip_wal、sst_format):这些选项充当模板变量,仅在创建新表时应用。更改这些数据库级别的选项不会影响已存在的表——它们仅作为新创建表的默认值。
在创建表时,如果未提供相应的表选项,将使用在数据库级别配置的选项或者默认值。
示例
创建名为 test 的数据库:
CREATE DATABASE test;
Query OK, 1 row affected (0.05 sec)
使用 IF NOT EXISTS 再次创建:
CREATE DATABASE IF NOT EXISTS test;
创建一个具有 7 天 TTL(数据存活时间)的数据库,也就是该数据库中的所有表如果没有单独设置 TTL 选项,都将继承此选项值。
CREATE DATABASE test WITH (ttl='7d');
创建一个带有多个选项的数据库,包括仅追加模式和自定义内存表类型:
CREATE DATABASE test WITH (
ttl='30d',
'memtable.type'='partition_tree',
'append_mode'='true'
);
创建一个禁用预写日志并设置自定义合并模式的数据库:
CREATE DATABASE test WITH (
'skip_wal'='true',
'merge_mode'='last_non_null'
);
创建一个指定 SST 文件格式的数据库:
CREATE DATABASE test WITH ('sst_format'='flat');
CREATE TABLE
Syntax
在 db 或当前数据库中创建新表:
CREATE TABLE [IF NOT EXISTS] [db.]table_name
(
column1 type1 [NULL | NOT NULL] [DEFAULT expr1] [TIME INDEX] [PRIMARY KEY] [indexes] [COMMENT comment1],
column2 type2 [NULL | NOT NULL] [DEFAULT expr2] [TIME INDEX] [PRIMARY KEY] [indexes] [COMMENT comment2],
...
[TIME INDEX (column)],
[PRIMARY KEY(column1, column2, ...)],
)
[
PARTITION ON COLUMNS(column1, column2, ...) (
<PARTITION EXPR>,
...
)
]
ENGINE = engine WITH([TTL | storage | ...] = expr, ...)
表 schema 由 ENGINE 之前的括号指定,表 schema 是列的定义和表的约束。
列定义包括列名称和数据类型,以及可选的 NULL、NOT NULL、DEFAULT 等。
关于 engine 选项和表引擎的选择,请阅读表引擎介绍。
表约束
表约束包括以下内容:
TIME INDEX指定时间索引列,每个表只能有一个时间索引列。它表示 GreptimeDB 的 数据模型 中的Timestamp类型。PRIMARY KEY指定表的主键列,它表示 GreptimeDB 的 数据模型 中的Tag类型。它不能包含时间索引列,但是它总是隐式地将时间索引列添加到键的末尾。- 其他列是 GreptimeDB 的 数据模型 中的
Field类型。
PRIMARY KEY 列和 TIME INDEX 共同组成用于排序与合并数据行的存储键。与关系数据库的主键不同,该存储键不强制唯一性。merge_mode和 append_mode决定 GreptimeDB 如何处理存储键相同的数据行。
如果表已经存在且创建表时指定了 IF NOT EXISTS,CREATE 语句不会返回错误;否则返回错误。
索引
GreptimeDB 提供了丰富的索引实现来加速查询,请在索引章节查看更多信息。
表选项
用户可以使用 WITH 添加表选项。有效的选项包括以下内容:
| 选项 | 描述 | 值 |
|---|---|---|
ttl | 表数据的存储时间 | 一个时间范围字符串,例如 '60m', '1h' 代表 1 小时, '14d' 代表 14 天等。支持的时间单位有:s / m / h / d |
storage | 自定义表的存储引擎,存储引擎提供商的名字 | 字符串,类似 S3、Gcs 等。必须在 [[storage.providers]] 列表里配置,参考 configuration。 |
compaction.type | Compaction 策略 | 字符串值。只支持 twcs。你可以阅读这篇文章来了解 twcs compaction 策略 |
compaction.twcs.trigger_file_num | 某个窗口内触发 compaction 的最小文件数量阈值 | 字符串值,如 '8'。只在 compaction.type 为 twcs 时可用 |
compaction.twcs.time_window | Compaction 时间窗口 | 字符串值,如 '1d' 表示 1 天。该表会根据时间戳将数据分区到不同的时间窗口中。只在 compaction.type 为 twcs 时可用 |
compaction.twcs.max_output_file_size | TWCS compaction 的最大输出文件大小 | 字符串值,如 '1GB'、'512MB'。设置 TWCS compaction 产生的文件的最大大小。只在 compaction.type 为 twcs 时可用 |
memtable.type | memtable 的类型 | 字符串值,支持 time_series,partition_tree |
append_mode | 该表是否时 append-only 的 | 字符串值。默认值为 'false',根据 'merge_mode' 按主键和时间戳删除重复行。设置为 'true' 可以开启 append 模式和创建 append-only 表,保留所有重复的行 |
merge_mode | 合并重复行的策略 | 字符串值。只有当 append_mode 为 'false' 时可用。默认值为 last_row,保留相同主键和时间戳的最后一行。设置为 last_non_null 则保留相同主键和时间戳的最后一个非空字段。 |
sst_format | SST 文件的格式 | 字符串值,支持 primary_key,flat。默认为 flat。flat 格式建议用于具有高基数主键的表。 |
comment | 表级注释 | 字符串值。 |
index.type | Index 类型 | 仅用于 metric engine 字符串值,支持 none, skipping. |
skip_wal | 是否关闭表的预写日志 | 字符串类型。当设置为 'true' 时表的写入数据将不会持久化到预写日志,可以避免存储磨损同时提升写入吞吐。但是当进程重启时,尚未 flush 的数据会丢失。请仅在数据源本身可以确保可靠性的情况下使用此功能。 |
write_buffer_size | 该表的单 region 写缓冲区阻塞阈值 | 字符串类型,例如 '512MB' 或 '1GB'。设置为正值后,mutable memtable 内存用量达到该值的一半时,GreptimeDB 会调度 flush;达到该值时会阻塞写入,达到该值的 2 倍时会拒绝写入。该表选项会覆盖 region_engine.mito.default_region_write_buffer_size。即使引擎默认值非零,显式设置为 '0' 也会禁用单 region 限制。取消设置会移除表级覆盖,并回退 到引擎默认值。 |
auto_flush_interval | 该表的 region 最长多久没有 flush 就触发一次 flush | 字符串类型,是一个时间范围字符串,例如 '5m' 或 '1h',必须大于 0。该表选项会覆盖引擎级的 region_engine.mito.auto_flush_interval。用 ALTER TABLE 将其设为 NULL 可以移除表级覆盖、回退到引擎级配置。 |
max_row_group_row_count | Parquet row group 的最大行数 | 字符串类型,表示 1 到 10485760(10 * 1024 * 1024)之间的整数。未设置该选项时,默认值为 102400(100 * 1024)。 |
创建自定义 row group 大小的表
CREATE TABLE IF NOT EXISTS temperatures(
ts TIMESTAMP TIME INDEX,
temperature DOUBLE DEFAULT 10
) WITH ('max_row_group_row_count' = '1024');
建议大多数用户使用默认的 row group 大小。在高级使用场景中,可以针对具体工作负载对不同的值进行基准测试以提升性能;如果单个 row group 占用的内存过大,也可以调小该值。较小的 row group 可以降低内存用量并提供更细粒度的剪枝,但会产生更多 row group 并增加元数据开销。较大的 row group 则相反。
创建指定 TTL 的表
例如,创建一个存储数据 TTL(Time-To-Live) 为七天的表:
CREATE TABLE IF NOT EXISTS temperatures(
ts TIMESTAMP TIME INDEX,
temperature DOUBLE DEFAULT 10,
) with(ttl='7d');
ttl 值是一个字符串,支持以下类型的值:
- 时间范围字符串,如
1hour 12min 5s。 forever,NULL,0s(或任何长度为 0 的时间范围,如0d)或空字符串'',表示数据永远不会被删除。instant, 注意数据库的 TTL 不能设置为instant。instant表示数据在插入时立即删除。对于新的 Flow workload,请避免使用instantTTL 的 source 表,因为它们会回退到已废弃的 streaming mode;请参阅 Flow 管理文档了解更多细节。- 未设置,可以使用
ALTER TABLE <table-name> UNSET 'ttl'来取消表的ttl设置,这样表将继承数据库的ttl策略(如果有的话)。
如果一张表有自己的 TTL 策略,那么它将使用该 TTL 策略。否则,数据库的 TTL 策略将被应用到表上。
比如说,如果表的 TTL 设置为 forever,那么无论数据库的 TTL 是什么,数据都不会被删除。但是如果你取消表的 TTL 设置:
ALTER TABLE <table-name> UNSET 'ttl';
那么数据库的 TTL 将会被应用到表上。
请注意表和数据库的默认 TTL 策略都是未设置,也就是没有设置 TTL,代表着数据永远不会删除。