blob: 59be14a18cee0083b8a77a3b404a1ee393e02ca1 [file] [log] [blame] [view]
---
{
"title": "CREATE-TABLE",
"language": "zh-CN",
"toc_min_heading_level": 2,
"toc_max_heading_level": 4
}
---
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
## CREATE-TABLE
### Description
该命令用于创建一张表。本文档主要介绍创建 Doris 自维护的表的语法。外部表语法请参阅 [CREATE-EXTERNAL-TABLE](./CREATE-EXTERNAL-TABLE.md)文档。
```sql
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] [default_value] [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 类型的列的聚合方式,进行位图的并集聚合。
```
* `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
```
示例:
```text
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"
```
#### index_definition_list
索引列表定义:
`index_definition[, index_definition]`
* `index_definition`
索引定义:
```sql
INDEX index_name (col_name) [USING INVERTED] COMMENT 'xxxxxx'
```
示例:
```sql
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。其他外部表引擎类型见 [CREATE EXTERNAL TABLE](./CREATE-EXTERNAL-TABLE.md) 文档。示例:
`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
)
```
:::tip 提示
该功能自 Apache Doris 1.2 版本起支持
:::
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` 属性的功能。
* `is_being_synced`
用于标识此表是否是被 CCR 复制而来并且正在被 syncer 同步,默认为 `false`
如果设置为 `true`
`colocate_with``storage_policy`属性将被擦除
`dynamic partition``auto 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 表的默认压缩方式是 LZ41.1 版本后,支持将压缩方式指定为 ZSTD 以获得更高的压缩比。
`"compression"="zstd"`
* `function_column.sequence_col`
当使用 UNIQUE KEY 模型时,可以指定一个 sequence 列,当 KEY 列相同时,将按照 sequence 列进行 REPLACE(较大值替换较小值,否则无法替换)
`function_column.sequence_col`用来指定 sequence 列到表中某一列的映射,该列可以为整型和时间类型(DATEDATETIME),创建后不能更改该列的类型。如果设置了`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'`
* `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`时,如果创建表的时候没有指定 UniqueAggregate 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" = ""`
* `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"`
* 动态分区相关
动态分区相关参数如下:
* `dynamic_partition.enable`: 用于指定表级别的动态分区功能是否开启。默认为 true
* `dynamic_partition.time_unit:` 用于指定动态添加分区的时间单位,可选择为 DAY(天),WEEK(周),MONTH(月),YEAR(年),HOUR(时)。
* `dynamic_partition.start`: 用于指定向前删除多少个分区。值必须小于 0。默认为 Integer.MIN_VALUE
* `dynamic_partition.end`: 用于指定提前创建的分区数量。值必须大于 0
* `dynamic_partition.prefix`: 用于指定创建的分区名前缀,例如分区名前缀为 p,则自动创建分区名为 p20200108
* `dynamic_partition.buckets`: 用于指定自动创建的分区分桶数量。
* `dynamic_partition.create_history_partition`: 是否创建历史分区。
* `dynamic_partition.history_partition_num`: 指定创建历史分区的数量。
* `dynamic_partition.reserved_history_periods`: 用于指定保留的历史分区的时间段。
### Example
1. 创建一个明细模型的表
```sql
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
```sql
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. 创建一个主键唯一模型的表,设置初始存储介质和冷却时间
```sql
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. 创建一个聚合模型表,使用固定范围分区描述
```sql
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 列类型的聚合模型表
```sql
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 自维护的表。
```sql
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 索引的表
```sql
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]; )
```
```sql
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)的表。
```sql
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` 属性设置表的副本。
```sql
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"
);
```
```sql
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` 调整
:::tip 提示
该功能自 Apache Doris 1.2 版本起支持
:::
1. 批量无排序列 Duplicate
```sql
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
#### 分区和分桶
一个表必须指定分桶列,但可以不指定分区。关于分区和分桶的具体介绍,可参阅 [数据划分](../../../../table-design/data-partition) 文档。
Doris 中的表可以分为分区表和无分区的表。这个属性在建表时确定,之后不可更改。即对于分区表,可以在之后的使用过程中对分区进行增删操作,而对于无分区的表,之后不能再进行增加分区等操作。
同时,分区列和分桶列在表创建之后不可更改,既不能更改分区和分桶列的类型,也不能对这些列进行任何增删操作。
所以建议在建表前,先确认使用方式来进行合理的建表。
#### 动态分区
动态分区功能主要用于帮助用户自动的管理分区。通过设定一定的规则,Doris 系统定期增加新的分区或删除历史分区。可参阅 [动态分区](../../../../table-design/data-partition) 文档查看更多帮助。
#### 物化视图
用户可以在建表的同时创建多个物化视图(ROLLUP)。物化视图也可以在建表之后添加。写在建表语句中可以方便用户一次性创建所有物化视图。
如果在建表时创建好物化视图,则后续的所有数据导入操作都会同步生成物化视图的数据。物化视图的数量可能会影响数据导入的效率。
如果在之后的使用过程中添加物化视图,如果表中已有数据,则物化视图的创建时间取决于当前数据量大小。
关于物化视图的介绍,请参阅文档 [物化视图](../../../../query/view-materialized-view/materialized-view)。
#### 索引
用户可以在建表的同时创建多个列的索引。索引也可以在建表之后再添加。
如果在之后的使用过程中添加索引,如果表中已有数据,则需要重写所有数据,因此索引的创建时间取决于当前数据量。