跳到主要内容
跳到主要内容

CREATE-TABLE

CREATE-TABLE

Description

该命令用于创建一张表。本文档主要介绍创建 Doris 自维护的表的语法

CREATE TABLE [IF NOT EXISTS] [database.]table
(
column_definition_list
[, index_definition_list]
)
[engine_type]
[keys_type]
[table_comment]
[partition_info]
distribution_desc
[rollup_list]
[properties]
[extra_properties]

column_definition_list

列定义列表:

column_definition[, column_definition]

  • column_definition 列定义:

    column_name column_type [KEY] [aggr_type] [NULL] [AUTO_INCREMENT(auto_inc_start_value)] [default_value] [on update current_timestamp] [column_comment]

    • column_type 列类型,支持以下类型:

      TINYINT(1 字节)
      范围:-2^7 + 1 ~ 2^7 - 1
      SMALLINT(2 字节)
      范围:-2^15 + 1 ~ 2^15 - 1
      INT(4 字节)
      范围:-2^31 + 1 ~ 2^31 - 1
      BIGINT(8 字节)
      范围:-2^63 + 1 ~ 2^63 - 1
      LARGEINT(16 字节)
      范围:-2^127 + 1 ~ 2^127 - 1
      FLOAT(4 字节)
      支持科学计数法
      DOUBLE(12 字节)
      支持科学计数法
      DECIMAL[(PRECISION, SCALE)] (16 字节)
      保证精度的小数类型。默认是 DECIMAL(9, 0)
      PRECISION: 1 ~ 27
      SCALE: 0 ~ 9
      其中整数部分为 1 ~ 18
      不支持科学计数法
      DATE(3 字节)
      范围:0000-01-01 ~ 9999-12-31
      DATETIME(8 字节)
      范围:0000-01-01 00:00:00 ~ 9999-12-31 23:59:59
      CHAR[(length)]
      定长字符串。长度范围:1 ~ 255。默认为 1
      VARCHAR[(length)]
      变长字符串。长度范围:1 ~ 65533。默认为 65533
      HLL (1~16385 个字节)
      HyperLogLog 列类型,不需要指定长度和默认值。长度根据数据的聚合程度系统内控制。
      必须配合 HLL_UNION 聚合类型使用。
      BITMAP
      bitmap 列类型,不需要指定长度和默认值。表示整型的集合,元素最大支持到 2^64 - 1。
      必须配合 BITMAP_UNION 聚合类型使用。
    • aggr_type 聚合类型,支持以下聚合类型:

      ```    
      SUM:求和。适用数值类型。
      MIN:求最小值。适合数值类型。
      MAX:求最大值。适合数值类型。
      REPLACE:替换。对于维度列相同的行,指标列会按照导入的先后顺序,后导入的替换先导入的。
      REPLACE_IF_NOT_NULL:非空值替换。和 REPLACE 的区别在于对于 NULL 值,不做替换。这里要注意的是字段默认值要给 NULL,而不能是空字符串,如果是空字符串,会给你替换成空字符串。
      HLL_UNION:HLL 类型的列的聚合方式,通过 HyperLogLog 算法聚合。
      BITMAP_UNION:BIMTAP 类型的列的聚合方式,进行位图的并集聚合。
      ```
    • AUTO_INCREMENT(auto_inc_start_value)

      是否为自增列,自增列可以用来为新插入的行生成一个唯一标识。在插入表数据时如果没有指定自增列的值,则会自动生成一个合法的值。当自增列被显示地插入 NULL 时,其值也会被替换为生成的合法值。需要注意的是,处于性能考虑,BE 会在内存中缓存部分自增列的值,所以自增列自动生成的值只能保证单调性和唯一性,无法保证严格的连续性。 一张表中至多有一个列是自增列,自增列必须是 BIGINT 类型,且必须为 NOT NULL。 Duplicate 模型表和 Unique 模型表均支持自增列。 可以通过给定auto_inc_start_value的方式指定自增列的起始值,如果不指定,则默认起始值为 1。

    • default_value 列默认值,当导入数据未指定该列的值时,系统将赋予该列 default_value

      语法为`default default_value`。

      当前 `default_value` 支持两种形式:
      1. 用户指定固定值,如:
      ```SQL
      k1 INT DEFAULT '1',
      k2 CHAR(10) DEFAULT 'aaaa'
      ```
      2. 系统提供的关键字,目前支持以下关键字:

      ```SQL
      // 只用于 DATETIME 类型,导入数据缺失该值时系统将赋予当前时间
      dt DATETIME DEFAULT CURRENT_TIMESTAMP
      // 只用于 DATE 类型,导入数据缺失该值时系统将赋予当前日期
      dt DATE DEFAULT CURRENT_DATE
      ```
    • on update current_timestamp

      是否在该行有列更新时将该列的值更新为当前时间 (`current_timestamp`)。该特性只能在开启了 Merge-on-Write 的 Unique 表上使用,开启了这个特性的列必须声明默认值,且默认值必须为`current_timestamp`。如果此处声明了时间戳的精度,则该列默认值中的时间戳精度必须与该处的时间戳精度相同。

    示例:

    k1 TINYINT,
    k2 DECIMAL(10,2) DEFAULT "10.5",
    k4 BIGINT NULL DEFAULT "1000" COMMENT "This is column k4",
    v1 VARCHAR(10) REPLACE NOT NULL,
    v2 BITMAP BITMAP_UNION,
    v3 HLL HLL_UNION,
    v4 INT SUM NOT NULL DEFAULT "1" COMMENT "This is column v4"
    dt datetime(6) default current_timestamp(6) on update current_timestamp(6)

index_definition_list

索引列表定义:

index_definition[, index_definition]

  • index_definition

    索引定义:

    INDEX index_name (col_name) [USING INVERTED] COMMENT 'xxxxxx'

    示例:

    INDEX idx1 (k1) USING INVERTED COMMENT "This is a inverted index1",
    INDEX idx2 (k2) USING INVERTED COMMENT "This is a inverted index2",
    ...

engine_type

表引擎类型。本文档中类型皆为 OLAP。示例:

`ENGINE=olap`

keys_type

数据模型。

key_type(col1, col2, ...)

key_type 支持以下模型:

  • DUPLICATE KEY(默认):其后指定的列为排序列。
  • AGGREGATE KEY:其后指定的列为维度列。
  • UNIQUE KEY:其后指定的列为主键列。
备注

注:当表属性enable_duplicate_without_keys_by_default = true时,默认创建没有排序列的 Duplicate 表。

示例:

DUPLICATE KEY(col1, col2),
AGGREGATE KEY(k1, k2, k3),
UNIQUE KEY(k1, k2)

table_comment

表注释。示例:

```
COMMENT "This is my first DORIS table"
```

partition_info

分区信息,支持三种写法:

  1. LESS THAN:仅定义分区上界。下界由上一个分区的上界决定。

    PARTITION BY RANGE(col1[, col2, ...])
    (
    PARTITION partition_name1 VALUES LESS THAN MAXVALUE|("value1", "value2", ...),
    PARTITION partition_name2 VALUES LESS THAN MAXVALUE|("value1", "value2", ...)
    )
  2. FIXED RANGE:定义分区的左闭右开区间。

    PARTITION BY RANGE(col1[, col2, ...])
    (
    PARTITION partition_name1 VALUES [("k1-lower1", "k2-lower1", "k3-lower1",...), ("k1-upper1", "k2-upper1", "k3-upper1", ...)),
    PARTITION partition_name2 VALUES [("k1-lower1-2", "k2-lower1-2", ...), ("k1-upper1-2", MAXVALUE, ))
    )
  3. MULTI RANGE:批量创建 RANGE 分区,定义分区的左闭右开区间,设定时间单位和步长,时间单位支持年、月、日、周和小时。

    PARTITION BY RANGE(col)
    (
    FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 1 YEAR,
    FROM ("2021-11-14") TO ("2022-11-14") INTERVAL 1 MONTH,
    FROM ("2022-11-14") TO ("2023-01-03") INTERVAL 1 WEEK,
    FROM ("2023-01-03") TO ("2023-01-14") INTERVAL 1 DAY
    )
  4. MULTI RANGE:批量创建数字类型的 RANGE 分区,定义分区的左闭右开区间,设定步长。

    PARTITION BY RANGE(int_col)
    (
    FROM (1) TO (100) INTERVAL 10
    )

distribution_desc

定义数据分桶方式。

  1. Hash 分桶 语法: DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num|auto] 说明: 使用指定的 Key 列进行哈希分桶。
  2. Random 分桶 语法: DISTRIBUTED BY RANDOM [BUCKETS num|auto] 说明: 使用随机数进行分桶。

rollup_list

建表的同时可以创建多个物化视图(ROLLUP)。

ROLLUP (rollup_definition[, rollup_definition, ...])

  • rollup_definition

    rollup_name (col1[, col2, ...]) [DUPLICATE KEY(col1[, col2, ...])] [PROPERTIES("key" = "value")]

    示例:

    ROLLUP (
    r1 (k1, k3, v1, v2),
    r2 (k1, v1)
    )

properties

设置表属性。目前支持以下属性:

  • replication_num

    副本数。默认副本数为 3。如果 BE 节点数量小于 3,则需指定副本数小于等于 BE 节点数量。

    在 0.15 版本后,该属性将自动转换成 replication_allocation 属性,如:

    "replication_num" = "3" 会自动转换成 "replication_allocation" = "tag.location.default:3"

  • replication_allocation

    根据 Tag 设置副本分布情况。该属性可以完全覆盖 replication_num 属性的功能。

  • min_load_replica_num

    设定数据导入成功所需的最小副本数,默认值为 -1。当该属性小于等于 0 时,表示导入数据仍需多数派副本成功。

  • is_being_synced

    用于标识此表是否是被 CCR 复制而来并且正在被 Syncer 同步,默认为 false

    如果设置为 true
    colocate_withstorage_policy属性将被擦除
    dynamic partitionauto bucket功能将会失效,即在show create table中显示开启状态,但不会实际生效。当is_being_synced被设置为 false 时,这些功能将会恢复生效。

    这个属性仅供 CCR 外围模块使用,在 CCR 同步的过程中不要手动设置。

  • storage_medium/storage_cooldown_time

    数据存储介质。storage_medium 用于声明表数据的初始存储介质,而 storage_cooldown_time 用于设定到期时间。示例:

    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2020-11-20 00:00:00"

    这个示例表示数据存放在 SSD 中,并且在 2020-11-20 00:00:00 到期后,会自动迁移到 HDD 存储上。

  • colocate_with

    当需要使用 Colocation Join 功能时,使用这个参数设置 Colocation Group。

    "colocate_with" = "group1"

  • bloom_filter_columns

    用户指定需要添加 Bloom Filter 索引的列名称列表。各个列的 Bloom Filter 索引是独立的,并不是组合索引。

    "bloom_filter_columns" = "k1, k2, k3"

  • in_memory

    已弃用。只支持设置为'false'。

  • compression

    Doris 表的默认压缩方式是 LZ4。1.1 版本后,支持将压缩方式指定为 ZSTD 以获得更高的压缩比。

    "compression"="zstd"

  • function_column.Sequence_col

    当使用 Unique Key 模型时,可以指定一个 Sequence 列,当 Key 列相同时,将按照 Sequence 列进行 REPLACE(较大值替换较小值,否则无法替换)

    function_column.sequence_col用来指定 Sequence 列到表中某一列的映射,该列可以为整型和时间类型(DATE、DATETIME),创建后不能更改该列的类型。如果设置了function_column.sequence_col, function_column.sequence_type将被忽略。

    "function_column.sequence_col" = 'column_name'

  • function_column.sequence_type

    当使用 Unique Key 模型时,可以指定一个 Sequence 列,当 Key 列相同时,将按照 Sequence 列进行 REPLACE (较大值替换较小值,否则无法替换)

    这里我们仅需指定顺序列的类型,支持时间类型或整型。Doris 会创建一个隐藏的顺序列。

    "function_column.sequence_type" = 'Date'

  • enable_unique_key_merge_on_write

    Unique 表是否使用 Merge-on-Write 实现。

    该属性在 2.1 版本之前默认关闭,从 2.1 版本开始默认开启。

  • light_schema_change

    是否使用 Light Schema Change 优化。

    如果设置成 true, 对于值列的加减操作,可以更快地,同步地完成。

    "light_schema_change" = 'true'

    该功能在 2.0.0 及之后版本默认开启。

  • disable_auto_compaction

    是否对这个表禁用自动 Compaction。

    如果这个属性设置成 true, 后台的自动 Compaction 进程会跳过这个表的所有 Tablet。

    "disable_auto_compaction" = "false"

  • enable_single_replica_compaction

    是否对这个表开启单副本 compaction。

    如果这个属性设置成 true, 这个表的 tablet 的所有副本只有一个 do compaction,其他的从该副本拉取 rowset

    "enable_single_replica_compaction" = "false"

  • enable_duplicate_without_keys_by_default

    当配置为true时,如果创建表的时候没有指定 Unique、Aggregate 或 Duplicate 模型,会默认创建一个没有排序列和前缀索引的 Duplicate 模型的表。

    "enable_duplicate_without_keys_by_default" = "false"

  • skip_write_index_on_load

    是否对这个表开启数据导入时不写索引。

    如果这个属性设置成 true, 数据导入的时候不写索引(目前仅对倒排索引生效),而是在 Compaction 的时候延迟写索引。这样可以避免首次写入和 Compaction 重复写索引的 CPU 和 IO 资源消耗,提升高吞吐导入的性能。

    "skip_write_index_on_load" = "false"

  • compaction_policy

    配置这个表的 Compaction 的合并策略,仅支持配置为 time_series 或者 size_based

    time_series: 当 rowset 的磁盘体积积攒到一定大小时进行版本合并。合并后的 rowset 直接晋升到 base compaction 阶段。在时序场景持续导入的情况下有效降低 compact 的写入放大率

    此策略将使用 time_series_compaction 为前缀的参数调整 Compaction 的执行

    "compaction_policy" = ""

  • group_commit_interval_ms

    配置这个表的 Group Commit 攒批间隔。单位为 ms,默认值为 10000ms,即 10s。

    Group Commit 的下刷时机取决于 group_commit_interval_ms以及group_commit_data_bytes哪个先到设置的值。

    "group_commit_interval_ms" = "10000"

  • group_commit_data_bytes

    配置这个表的 Group Commit 攒批数据大小。单位为 bytes,默认值为 134217728 bytes,即 128MB。

    Group Commit 的下刷时机取决于 group_commit_interval_ms以及group_commit_data_bytes 哪个先到设置的值。

    "group_commit_data_bytes" = "134217728"

  • time_series_compaction_goal_size_mbytes

    Compaction 的合并策略为 time_series 时,将使用此参数来调整每次 Compaction 输入的文件的大小,输出的文件大小和输入相当

    "time_series_compaction_goal_size_mbytes" = "1024"

  • time_series_compaction_file_count_threshold

    compaction 的合并策略为 time_series 时,将使用此参数来调整每次 Compaction 输入的文件数量的最小值

    一个 tablet 中,文件数超过该配置,就会触发 compaction

    "time_series_compaction_file_count_threshold" = "2000"

  • time_series_compaction_time_threshold_seconds

    Compaction 的合并策略为 time_series 时,将使用此参数来调整 Compaction 的最长时间间隔,即长时间未执行过 Compaction 时,就会触发一次 Compaction,单位为秒

    "time_series_compaction_time_threshold_seconds" = "3600"

  • time_series_compaction_level_threshold

    Compaction 的合并策略为 time_series 时,此参数默认为 1,当设置为 2 时用来控住对于合并过一次的段再合并一层,保证段大小达到 time_series_compaction_goal_size_mbytes

    能达到段数量减少的效果。

    "time_series_compaction_level_threshold" = "2"

  • enable_mow_light_delete

    是否在 Unique 表 Mow 上开启 Delete 语句写 Delete predicate。若开启,会提升 Delete 语句的性能,但 Delete 后进行部分列更新可能会出现部分数据错误的情况。若关闭,会降低 Delete 语句的性能来保证正确性。

    此属性的默认值为 false

    此属性只能在 Unique Merge-on-Write 表上开启。

    "enable_mow_light_delete" = "true"

  • 动态分区相关

    动态分区相关参考数据划分-动态分区

  • file_cache_ttl_seconds:

    TTL 在计算存储分离模式下的过期时间。

Example

  1. 创建一个明细模型的表

    CREATE TABLE example_db.table_hash
    (
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.5",
    k3 CHAR(10) COMMENT "string column",
    k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
    )
    COMMENT "my first table"
    DISTRIBUTED BY HASH(k1) BUCKETS 32
  2. 创建一个明细模型的表,分区,指定排序列,设置副本数为 1

    CREATE TABLE example_db.table_hash
    (
    k1 DATE,
    k2 DECIMAL(10, 2) DEFAULT "10.5",
    k3 CHAR(10) COMMENT "string column",
    k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
    )
    DUPLICATE KEY(k1, k2)
    COMMENT "my first table"
    PARTITION BY RANGE(k1)
    (
    PARTITION p1 VALUES LESS THAN ("2020-02-01"),
    PARTITION p2 VALUES LESS THAN ("2020-03-01"),
    PARTITION p3 VALUES LESS THAN ("2020-04-01")
    )
    DISTRIBUTED BY HASH(k1) BUCKETS 32
    PROPERTIES (
    "replication_num" = "1"
    );
  3. 创建一个主键唯一模型的表,设置初始存储介质和冷却时间

    CREATE TABLE example_db.table_hash
    (
    k1 BIGINT,
    k2 LARGEINT,
    v1 VARCHAR(2048),
    v2 SMALLINT DEFAULT "10"
    )
    UNIQUE KEY(k1, k2)
    DISTRIBUTED BY HASH (k1, k2) BUCKETS 32
    PROPERTIES(
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2015-06-04 00:00:00"
    );
  4. 创建一个聚合模型表,使用固定范围分区描述

    CREATE TABLE table_range
    (
    k1 DATE,
    k2 INT,
    k3 SMALLINT,
    v1 VARCHAR(2048) REPLACE,
    v2 INT SUM DEFAULT "1"
    )
    AGGREGATE KEY(k1, k2, k3)
    PARTITION BY RANGE (k1, k2, k3)
    (
    PARTITION p1 VALUES [("2014-01-01", "10", "200"), ("2014-01-01", "20", "300")),
    PARTITION p2 VALUES [("2014-06-01", "100", "200"), ("2014-07-01", "100", "300"))
    )
    DISTRIBUTED BY HASH(k2) BUCKETS 32
  5. 创建一个包含 HLL 和 BITMAP 列类型的聚合模型表

    CREATE TABLE example_db.example_table
    (
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.5",
    v1 HLL HLL_UNION,
    v2 BITMAP BITMAP_UNION
    )
    ENGINE=olap
    AGGREGATE KEY(k1, k2)
    DISTRIBUTED BY HASH(k1) BUCKETS 32
  6. 创建两张同一个 Colocation Group 自维护的表。

    CREATE TABLE t1 (
    id int(11) COMMENT "",
    value varchar(8) COMMENT ""
    )
    DUPLICATE KEY(id)
    DISTRIBUTED BY HASH(id) BUCKETS 10
    PROPERTIES (
    "colocate_with" = "group1"
    );

    CREATE TABLE t2 (
    id int(11) COMMENT "",
    value1 varchar(8) COMMENT "",
    value2 varchar(8) COMMENT ""
    )
    DUPLICATE KEY(`id`)
    DISTRIBUTED BY HASH(`id`) BUCKETS 10
    PROPERTIES (
    "colocate_with" = "group1"
    );
  7. 创建一个带有倒排索引以及 bloom filter 索引的表

    CREATE TABLE example_db.table_hash
    (
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.5",
    v1 CHAR(10) REPLACE,
    v2 INT SUM,
    INDEX k1_idx (k1) USING INVERTED COMMENT 'my first index'
    )
    AGGREGATE KEY(k1, k2)
    DISTRIBUTED BY HASH(k1) BUCKETS 32
    PROPERTIES (
    "bloom_filter_columns" = "k2"
    );
  8. 创建一个动态分区表。

    该表每天提前创建 3 天的分区,并删除 3 天前的分区。例如今天为2020-01-08,则会创建分区名为p20200108, p20200109, p20200110, p20200111的分区。分区范围分别为:

    [types: [DATE]; keys: [2020-01-08]; ‥types: [DATE]; keys: [2020-01-09]; )
    [types: [DATE]; keys: [2020-01-09]; ‥types: [DATE]; keys: [2020-01-10]; )
    [types: [DATE]; keys: [2020-01-10]; ‥types: [DATE]; keys: [2020-01-11]; )
    [types: [DATE]; keys: [2020-01-11]; ‥types: [DATE]; keys: [2020-01-12]; )
    CREATE TABLE example_db.dynamic_partition
    (
    k1 DATE,
    k2 INT,
    k3 SMALLINT,
    v1 VARCHAR(2048),
    v2 DATETIME DEFAULT "2014-02-04 15:36:00"
    )
    DUPLICATE KEY(k1, k2, k3)
    PARTITION BY RANGE (k1) ()
    DISTRIBUTED BY HASH(k2) BUCKETS 32
    PROPERTIES(
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-3",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.buckets" = "32"
    );
  9. 创建一个带有物化视图(ROLLUP)的表。

    CREATE TABLE example_db.rolup_index_table
    (
    event_day DATE,
    siteid INT DEFAULT '10',
    citycode SMALLINT,
    username VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
    )
    AGGREGATE KEY(event_day, siteid, citycode, username)
    DISTRIBUTED BY HASH(siteid) BUCKETS 10
    ROLLUP (
    r1(event_day,siteid),
    r2(event_day,citycode),
    r3(event_day)
    )
    PROPERTIES("replication_num" = "3");
  10. 通过 replication_allocation 属性设置表的副本。

    CREATE TABLE example_db.table_hash
    (
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.5"
    )
    DISTRIBUTED BY HASH(k1) BUCKETS 32
    PROPERTIES (
    "replication_allocation"="tag.location.group_a:1, tag.location.group_b:2"
    );
    CREATE TABLE example_db.dynamic_partition
    (
    k1 DATE,
    k2 INT,
    k3 SMALLINT,
    v1 VARCHAR(2048),
    v2 DATETIME DEFAULT "2014-02-04 15:36:00"
    )
    PARTITION BY RANGE (k1) ()
    DISTRIBUTED BY HASH(k2) BUCKETS 32
    PROPERTIES(
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-3",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.buckets" = "32",
    "dynamic_partition.replication_allocation" = "tag.location.group_a:3"
    );
  11. 通过storage_policy属性设置表的冷热分层数据迁移策略

    ```sql
    CREATE TABLE IF NOT EXISTS create_table_use_created_policy
    (
    k1 BIGINT,
    k2 LARGEINT,
    v1 VARCHAR(2048)
    )
    UNIQUE KEY(k1)
    DISTRIBUTED BY HASH (k1) BUCKETS 3
    PROPERTIES(
    "storage_policy" = "test_create_table_use_policy",
    "replication_num" = "1"
    );
    ```

    注:需要先创建 S3 Resource 和 Storage Policy,表才能关联迁移策略成功

  12. 为表的分区添加冷热分层数据迁移策略

    ```sql
    CREATE TABLE create_table_partion_use_created_policy
    (
    k1 DATE,
    k2 INT,
    V1 VARCHAR(2048) REPLACE
    ) PARTITION BY RANGE (k1) (
    PARTITION p1 VALUES LESS THAN ("2022-01-01") ("storage_policy" = "test_create_table_partition_use_policy_1" ,"replication_num"="1"),
    PARTITION p2 VALUES LESS THAN ("2022-02-01") ("storage_policy" = "test_create_table_partition_use_policy_2" ,"replication_num"="1")
    ) DISTRIBUTED BY HASH(k2) BUCKETS 1;
    ```

    注:需要先创建 S3 Resource 和 Storage Policy,表才能关联迁移策略成功

  13. 批量创建分区

    ```sql
    CREATE TABLE create_table_multi_partion_date
    (
    k1 DATE,
    k2 INT,
    V1 VARCHAR(20)
    ) PARTITION BY RANGE (k1) (
    FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 1 YEAR,
    FROM ("2021-11-14") TO ("2022-11-14") INTERVAL 1 MONTH,
    FROM ("2022-11-14") TO ("2023-01-03") INTERVAL 1 WEEK,
    FROM ("2023-01-03") TO ("2023-01-14") INTERVAL 1 DAY,
    PARTITION p_20230114 VALUES [('2023-01-14'), ('2023-01-15'))
    ) DISTRIBUTED BY HASH(k2) BUCKETS 1
    PROPERTIES(
    "replication_num" = "1"
    );
    ```
    ```sql
    CREATE TABLE create_table_multi_partion_date_hour
    (
    k1 DATETIME,
    k2 INT,
    V1 VARCHAR(20)
    ) PARTITION BY RANGE (k1) (
    FROM ("2023-01-03 12") TO ("2023-01-14 22") INTERVAL 1 HOUR
    ) DISTRIBUTED BY HASH(k2) BUCKETS 1
    PROPERTIES(
    "replication_num" = "1"
    );
    ```
    ```sql
    CREATE TABLE create_table_multi_partion_integer
    (
    k1 BIGINT,
    k2 INT,
    V1 VARCHAR(20)
    ) PARTITION BY RANGE (k1) (
    FROM (1) TO (100) INTERVAL 10
    ) DISTRIBUTED BY HASH(k2) BUCKETS 1
    PROPERTIES(
    "replication_num" = "1"
    );
    ```
    备注

    注:批量创建分区可以和常规手动创建分区混用,使用时需要限制分区列只能有一个,批量创建分区实际创建默认最大数量为 4096,这个参数可以在 FE 配置项 max_multi_partition_num 调整。

  14. 批量无排序列 Duplicate 表

    CREATE TABLE example_db.table_hash
    (
    k1 DATE,
    k2 DECIMAL(10, 2) DEFAULT "10.5",
    k3 CHAR(10) COMMENT "string column",
    k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
    )
    COMMENT "duplicate without keys"
    PARTITION BY RANGE(k1)
    (
    PARTITION p1 VALUES LESS THAN ("2020-02-01"),
    PARTITION p2 VALUES LESS THAN ("2020-03-01"),
    PARTITION p3 VALUES LESS THAN ("2020-04-01")
    )
    DISTRIBUTED BY HASH(k1) BUCKETS 32
    PROPERTIES (
    "replication_num" = "1",
    "enable_duplicate_without_keys_by_default" = "true"
    );

Keywords

CREATE, TABLE

Best Practice

分区和分桶

一个表必须指定分桶列,但可以不指定分区。关于分区和分桶的具体介绍,可参阅 数据划分 文档。

Doris 中的表可以分为分区表和无分区的表。这个属性在建表时确定,之后不可更改。即对于分区表,可以在之后的使用过程中对分区进行增删操作,而对于无分区的表,之后不能再进行增加分区等操作。

同时,分区列和分桶列在表创建之后不可更改,既不能更改分区和分桶列的类型,也不能对这些列进行任何增删操作。

所以建议在建表前,先确认使用方式来进行合理的建表。

动态分区

动态分区功能主要用于帮助用户自动的管理分区。通过设定一定的规则,Doris 系统定期增加新的分区或删除历史分区。可参阅 动态分区 文档查看更多帮助。

自动分区

自动分区功能文档参见 自动分区

物化视图

用户可以在建表的同时创建多个物化视图(ROLLUP)。物化视图也可以在建表之后添加。写在建表语句中可以方便用户一次性创建所有物化视图。

如果在建表时创建好物化视图,则后续的所有数据导入操作都会同步生成物化视图的数据。物化视图的数量可能会影响数据导入的效率。

如果在之后的使用过程中添加物化视图,如果表中已有数据,则物化视图的创建时间取决于当前数据量大小。

关于物化视图的介绍,请参阅文档 同步物化视图

索引

用户可以在建表的同时创建多个列的索引。索引也可以在建表之后再添加。

如果在之后的使用过程中添加索引,如果表中已有数据,则需要重写所有数据,因此索引的创建时间取决于当前数据量。