子句
IF NOT EXISTS
db_name 数据库已存在,则 ClickHouse 不会创建新的数据库,并且:
- 如果指定了该子句,则不会抛出异常。
- 如果未指定该子句,则会抛出异常。
ON CLUSTER
db_name 数据库。更多信息,请参见 Distributed DDL 一文。
引擎
注释
Query
Response
SETTINGS
lazy_load_tables
Atomic、Ordinary) 。无论此设置如何,视图、materialized view、字典以及基于表函数的表始终都会立即加载。
何时使用: 对于拥有大量表 (数百张甚至数千张) 、但只有一部分会被频繁查询的数据库,此设置非常有用。它会将表引擎对象的创建、数据分区片段的扫描以及后台线程的初始化推迟到首次访问时再进行,从而减少服务器启动时间和内存占用。
对 system.tables 的影响:
- 在表被访问之前,
system.tables会将其引擎显示为TableProxy。首次访问后,则会显示真实的引擎名称 (例如MergeTree) 。 - 对于尚未加载的表,
total_rows和total_bytes等列会返回NULL,因为真实存储此时尚未创建。
SELECT、INSERT、ALTER、DROP在首次使用时会透明地触发真实表引擎的加载。RENAME TABLE无需触发加载即可工作。- 表一旦加载,在服务器进程的整个生命周期内都会保持已加载状态。
- 依赖
system.tables元数据 (例如total_rows、engine) 的监控工具,看到的未加载表信息可能不完整。 - 对未加载表执行第一次查询时会产生一次性加载开销 (解析已存储的
CREATE TABLE语句并初始化引擎) 。
0 (禁用) 。