@clickzetta/cz-cli-linux-x64 0.3.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,12 +24,15 @@ description: >
24
24
 
25
25
  | 功能 | ❌ 错误写法(Snowflake/标准SQL) | ✅ ClickZetta 正确写法 |
26
26
  |---|---|---|
27
- | 动态表计算集群 | `WAREHOUSE = compute_wh` | `VCLUSTER default`(直接跟名称,不带等号) |
27
+ | 动态表计算集群 | `WAREHOUSE = compute_wh` | `vcluster default`(直接跟名称,不带等号) |
28
28
  | 动态表刷新调度 | `TARGET_LAG = '1 minutes'` | `REFRESH INTERVAL 1 MINUTE vcluster default` |
29
- | Kafka 读取函数 | `KAFKA_SOURCE(...)` | `READ_KAFKA(KAFKA_BROKER => ..., KAFKA_DATA_FORMAT => 'json')` |
29
+ | Kafka 读取函数 | `TABLE(READ_KAFKA(KAFKA_BROKER => ...))` | `read_kafka('broker', 'topic', '', 'group', '', '', '', '', 'raw', 'raw', 0, MAP(...))` — 位置参数 |
30
30
  | 物化视图定时刷新 | `REFRESH EVERY 1 HOUR` | `REFRESH INTERVAL 60 MINUTE vcluster default`(与动态表语法相同) |
31
31
  | 物化视图手动刷新 | `REFRESH MATERIALIZED VIEW` 放在 CREATE 里 | 单独执行 `REFRESH MATERIALIZED VIEW <name>;` |
32
32
  | 修改动态表 SQL | `ALTER DYNAMIC TABLE ... AS ...` | `CREATE OR REPLACE DYNAMIC TABLE ...`(ALTER 不支持修改 AS 子句) |
33
+ | JSON 字段访问 | `$1:field::TYPE` 或 `data:key` | `parse_json(value::string)['field']::TYPE` 或 `data['key']` |
34
+ | COPY INTO 导入格式 | `FILE_FORMAT = (TYPE = CSV)` | `USING CSV OPTIONS(...)` |
35
+ | COPY INTO 导出格式 | `USING CSV` | `FILE_FORMAT = (TYPE = CSV)` |
33
36
 
34
37
  ---
35
38
 
@@ -91,14 +94,14 @@ CREATE SCHEMA IF NOT EXISTS ecommerce_gold;
91
94
  ```
92
95
 
93
96
  **来源 → 入口对象的选择规则:**
94
- - Kafka → `CREATE PIPE ... AS INSERT INTO ... FROM TABLE(READ_KAFKA(...))`
95
- - 对象存储(OSS/S3/COS)→ `CREATE PIPE ... VIRTUAL_CLUSTER = name INGEST_MODE = LIST_PURGE AS COPY INTO ... FROM VOLUME <volume_name> USING <format>`
97
+ - Kafka → `CREATE PIPE ... AS COPY INTO ... FROM (SELECT ... FROM read_kafka('broker', 'topic', '', 'group', '', '', '', '', 'raw', 'raw', 0, MAP(...)))`
98
+ - 对象存储(OSS/S3/COS)→ `CREATE PIPE ... VIRTUAL_CLUSTER = 'name' INGEST_MODE = 'LIST_PURGE' AS COPY INTO ... FROM VOLUME <volume_name> USING <format> PURGE=true`
96
99
  - 已有表 + 有 UPDATE/DELETE → `CREATE TABLE STREAM ... WITH PROPERTIES ('TABLE_STREAM_MODE' = 'STANDARD')`,中间层过滤 `__change_type IN ('INSERT', 'UPDATE_AFTER', 'DELETE')`
97
100
  - 已有表 + 仅 INSERT → Dynamic Table 直接 `FROM` 源表
98
101
 
99
102
  **刷新频率规则:**
100
- - 第一个转换层(Bronze→Silver 或 ODS→DWD)设置用户指定的刷新频率(如 `REFRESH interval 1 MINUTE VCLUSTER default`)
101
- - 下游层根据业务需求设置各自的刷新频率(如 `REFRESH interval 5 MINUTE VCLUSTER default`)
103
+ - 第一个转换层(Bronze→Silver 或 ODS→DWD)设置用户指定的刷新频率(如 `REFRESH INTERVAL 1 MINUTE vcluster default`)
104
+ - 下游层根据业务需求设置各自的刷新频率(如 `REFRESH INTERVAL 5 MINUTE vcluster default`)
102
105
 
103
106
  ---
104
107
 
@@ -146,12 +149,12 @@ CREATE SCHEMA IF NOT EXISTS ecommerce_gold;
146
149
  阅读对应参考文件后,根据用户提供的参数生成完整可运行 SQL。
147
150
 
148
151
  **必填参数检查:**
149
- - Dynamic Table:`REFRESH interval N MINUTE VCLUSTER name`、AS 查询
152
+ - Dynamic Table:`REFRESH INTERVAL N MINUTE vcluster name`、AS 查询
150
153
  - Table Stream:源表名、MODE(STANDARD 或 APPEND_ONLY)
151
- - Pipe(Kafka):`KAFKA_BROKER`、`KAFKA_TOPIC`、`KAFKA_GROUP_ID`、目标表
152
- - Pipe(对象存储):Volume 路径、文件格式、目标表
154
+ - Pipe(Kafka):bootstrap_servers、topic、group_id、目标表(位置参数语法)
155
+ - Pipe(对象存储):Volume 路径、文件格式、目标表、`PURGE=true`(LIST_PURGE 模式)
153
156
 
154
- 若用户未提供 VCLUSTER,默认使用 `default`。
157
+ 若用户未提供 VCLUSTER,默认使用 `default`(GP 型集群)。
155
158
 
156
159
  ## 步骤 3:验证
157
160
 
@@ -179,28 +182,35 @@ SHOW PIPES;
179
182
 
180
183
  ```sql
181
184
  -- Step 1: 创建 Pipe 持续摄入 Kafka 数据到 ODS 层
182
- CREATE OR REPLACE PIPE kafka_orders_pipe AS
183
- INSERT INTO ods.orders (order_id, user_id, amount, status, created_at)
184
- SELECT
185
- $1:order_id::STRING,
186
- $1:user_id::STRING,
187
- $1:amount::DECIMAL(10,2),
188
- $1:status::STRING,
189
- $1:created_at::TIMESTAMP
190
- FROM TABLE(
191
- READ_KAFKA(
192
- KAFKA_BROKER => 'kafka.example.com:9092',
193
- KAFKA_TOPIC => 'orders',
194
- KAFKA_GROUP_ID => 'lakehouse_ingest',
195
- KAFKA_OFFSET => 'latest',
196
- KAFKA_DATA_FORMAT => 'json'
185
+ -- ⚠️ 注意:ClickZetta 不支持 CREATE OR REPLACE PIPE,需用 CREATE PIPE 或先 DROP 再 CREATE
186
+ CREATE PIPE kafka_orders_pipe
187
+ VIRTUAL_CLUSTER = 'default'
188
+ BATCH_INTERVAL_IN_SECONDS = '60'
189
+ AS
190
+ COPY INTO ods.orders FROM (
191
+ SELECT
192
+ j['order_id']::STRING,
193
+ j['user_id']::STRING,
194
+ j['amount']::DECIMAL(10,2),
195
+ j['status']::STRING,
196
+ j['created_at']::TIMESTAMP
197
+ FROM (
198
+ SELECT parse_json(value::string) AS j
199
+ FROM read_kafka(
200
+ 'kafka.example.com:9092', -- bootstrap_servers
201
+ 'orders', -- topic
202
+ '', -- reserved
203
+ 'lakehouse_ingest', -- group_id
204
+ '', '', '', '', -- 位置参数留空,由 Pipe 管理
205
+ 'raw', 'raw', 0,
206
+ MAP('kafka.security.protocol', 'PLAINTEXT')
207
+ )
197
208
  )
198
209
  );
199
210
 
200
211
  -- Step 2: 动态表做 DWD 层清洗(每分钟增量刷新)
201
212
  CREATE OR REPLACE DYNAMIC TABLE dwd.orders_clean
202
- REFRESH interval 1 MINUTE
203
- VCLUSTER default
213
+ REFRESH INTERVAL 1 MINUTE vcluster default
204
214
  AS
205
215
  SELECT
206
216
  order_id,
@@ -214,8 +224,7 @@ WHERE amount > 0;
214
224
 
215
225
  -- Step 3: 动态表做 DWS 层聚合(每 5 分钟刷新)
216
226
  CREATE OR REPLACE DYNAMIC TABLE dws.order_hourly
217
- REFRESH interval 5 MINUTE
218
- VCLUSTER default
227
+ REFRESH INTERVAL 5 MINUTE vcluster default
219
228
  AS
220
229
  SELECT
221
230
  DATE_TRUNC('hour', created_at) AS hour,
@@ -236,19 +245,21 @@ CREATE TABLE STREAM ods.orders_stream
236
245
 
237
246
  -- Step 2: 动态表消费 Stream,过滤出最新状态
238
247
  CREATE OR REPLACE DYNAMIC TABLE dwd.orders_latest
239
- REFRESH interval 2 MINUTE
240
- VCLUSTER default
248
+ REFRESH INTERVAL 2 MINUTE vcluster default
241
249
  AS
242
250
  SELECT order_id, user_id, amount, status, created_at
243
251
  FROM ods.orders_stream
244
- WHERE __change_type IN ('INSERT', 'UPDATE_AFTER', 'DELETE');
252
+ WHERE __change_type IN ('INSERT', 'UPDATE_AFTER');
245
253
  ```
246
254
 
247
255
  ### 场景 C:物化视图加速 BI 查询
248
256
 
249
257
  ```sql
250
258
  -- 创建每小时刷新的物化视图
251
- CREATE OR REPLACE MATERIALIZED VIEW dws.mv_daily_revenue
259
+ -- ⚠️ 注意:ClickZetta 不支持 CREATE OR REPLACE MATERIALIZED VIEW
260
+ -- 方法 1: 先 DROP 再 CREATE(推荐)
261
+ DROP MATERIALIZED VIEW IF EXISTS dws.mv_daily_revenue;
262
+ CREATE MATERIALIZED VIEW dws.mv_daily_revenue
252
263
  COMMENT '每日收入汇总,供 BI 工具查询'
253
264
  REFRESH INTERVAL 60 MINUTE vcluster default
254
265
  AS
@@ -260,8 +271,14 @@ SELECT
260
271
  FROM dwd.orders_clean
261
272
  GROUP BY 1, 2;
262
273
 
274
+ -- 方法 2: 使用 BUILD DEFERRED + DISABLE QUERY REWRITE(复杂,不推荐)
275
+ -- CREATE OR REPLACE MATERIALIZED VIEW ... BUILD DEFERRED DISABLE QUERY REWRITE AS ...
276
+
263
277
  -- 手动触发刷新
264
278
  REFRESH MATERIALIZED VIEW dws.mv_daily_revenue;
279
+
280
+ -- 删除物化视图(⚠️ 注意:必须用 DROP MATERIALIZED VIEW,不能用 DROP TABLE)
281
+ DROP MATERIALIZED VIEW dws.mv_daily_revenue;
265
282
  ```
266
283
 
267
284
  ### 场景 D:运维操作
@@ -290,8 +307,7 @@ ALTER PIPE kafka_orders_pipe SET PIPE_EXECUTION_PAUSED = false;
290
307
  ```sql
291
308
  -- 创建参数化动态表(使用 SESSION_CONFIGS 定义参数)
292
309
  CREATE OR REPLACE DYNAMIC TABLE dwd.orders_partitioned
293
- REFRESH interval 30 MINUTE
294
- VCLUSTER default
310
+ REFRESH INTERVAL 30 MINUTE vcluster default
295
311
  AS
296
312
  SELECT order_id, user_id, amount, status, created_at, DATE(created_at) AS dt
297
313
  FROM ods.orders
@@ -306,25 +322,32 @@ REFRESH DYNAMIC TABLE dwd.orders_partitioned
306
322
 
307
323
  ### 场景 F:动态表 DML 操作(手动修正数据)
308
324
 
309
- 动态表默认不支持 DML,需先通过 SET 命令开启,**且每次执行 DML 前都需要重新 SET**:
325
+ ⚠️ **重要**:ClickZetta 动态表**不支持 DML 操作**(INSERT/UPDATE/DELETE)。如需修正数据,有以下方案:
310
326
 
327
+ **方案 1:重建动态表(推荐)**
311
328
  ```sql
312
- -- ⚠️ 必须在同一会话/批次中先执行 SET,再执行 DML
313
- SET cz.sql.dt.allow.dml = true;
314
-
315
- -- 手动插入补数据
316
- INSERT INTO dwd.orders_clean VALUES (999, 'manual_user', 100.00, 'COMPLETED', DATE('2024-06-15'), '2024-06-15');
329
+ -- 1. 在源表中修正数据
330
+ -- 2. 等待动态表自动刷新(下一次 REFRESH INTERVAL 会全量刷新)
331
+ ```
317
332
 
318
- -- 手动删除错误数据
319
- SET cz.sql.dt.allow.dml = true;
320
- DELETE FROM dwd.orders_clean WHERE order_id = 999;
333
+ **方案 2:使用普通表替代动态表**
334
+ ```sql
335
+ -- 对于需要频繁手动修正的场景,建议使用普通表 + 定时调度任务
336
+ -- 而不是动态表
337
+ CREATE TABLE dwd.orders_manual (
338
+ order_id STRING,
339
+ user_id STRING,
340
+ amount DECIMAL(10,2),
341
+ status STRING,
342
+ created_at TIMESTAMP,
343
+ dt DATE
344
+ );
321
345
  ```
322
346
 
323
- > ⚠️ **注意**:
324
- > - `SET cz.sql.dt.allow.dml = true` 必须与 DML 语句在同一执行批次中,不能分开执行
325
- > - 对动态表执行 DML 后,下一次自动刷新会触发**全量刷新**(而非增量),可能耗时较长
326
- > - **UPDATE 操作有限制**:动态表 UPDATE 可能因内部隐藏列(`MV__KEY`)报错,建议改用 DELETE + INSERT 或 MERGE INTO 替代
327
- > - 仅在数据修正等特殊场景使用 DML
347
+ > ⚠️ **动态表限制**:
348
+ > - 动态表是只读的,不支持 INSERT/UPDATE/DELETE
349
+ > - 数据修正应在源表进行,动态表会自动刷新
350
+ > - 如需手动控制数据,使用普通表 + Studio 调度任务
328
351
 
329
352
  ---
330
353
 
@@ -333,12 +356,15 @@ DELETE FROM dwd.orders_clean WHERE order_id = 999;
333
356
  | 错误 | 原因 | 解决方案 |
334
357
  |---|---|---|
335
358
  | `VCluster not available` | 计算集群未启动或名称错误 | 确认 VCLUSTER 名称,检查集群状态 |
336
- | 动态表刷新失败 | SQL 查询报错或源表结构变更 | `SHOW DYNAMIC TABLE REFRESH HISTORY` 查看错误详情 |
359
+ | 动态表刷新失败 | SQL 查询报错或源表结构变更 | `SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'xxx'` 查看错误详情 |
337
360
  | Stream 数据为空 | 已被消费或超出保留周期 | 检查源表 `data_retention_days`,确认是否已消费 |
338
- | Pipe 停止摄入 | Kafka offset 问题或连接断开 | `DESC PIPE` 查看状态,检查 Kafka 连接 |
361
+ | Pipe 停止摄入 | Kafka offset 问题或连接断开 | `DESC PIPE EXTENDED` 查看状态,检查 Kafka 连接 |
339
362
  | `Cannot ALTER AS clause` | 尝试用 ALTER 修改动态表 SQL | 改用 `CREATE OR REPLACE DYNAMIC TABLE` |
340
- | 动态表 UPDATE 报错 `Not support hidden column :MV__KEY` | 动态表内部实现限制 | 改用 `DELETE + INSERT` `MERGE INTO` 替代 UPDATE |
341
- | 动态表 DML 报错 `not allowed` | 未设置 DML 开关 | 在同一批次先执行 `SET cz.sql.dt.allow.dml = true;` |
363
+ | `CREATE OR REPLACE PIPE` 语法报错 | ClickZetta 不支持该语法 | `CREATE PIPE` 或先 `DROP PIPE` `CREATE` |
364
+ | `CREATE OR REPLACE MATERIALIZED VIEW` 语法报错 | 仅支持 `REWRITE DISABLED + BUILD DEFER` 模式 | 推荐用 `DROP MATERIALIZED VIEW` + `CREATE MATERIALIZED VIEW` |
365
+ | `DROP TABLE` 删除物化视图报错 | 对象类型不匹配 | 用 `DROP MATERIALIZED VIEW`(不是 `DROP TABLE`) |
366
+ | 动态表 DML 报错 `not allowed` | 动态表不支持 DML | 在源表修正数据,或使用普通表 + 调度任务 |
367
+ | `SET cz.sql.dt.allow.dml` 报错 | 不支持 session statement | 动态表不支持 DML 操作,改用其他方案 |
342
368
 
343
369
  ---
344
370
 
@@ -1,9 +1,12 @@
1
1
  # Dynamic Table(动态表)SQL 参考
2
2
 
3
3
  > **⚠️ ClickZetta 特有语法**
4
- > - 刷新调度写法:`REFRESH interval 5 MINUTE VCLUSTER default`(不是 `TARGET_LAG`)
4
+ > - 刷新调度写法:`REFRESH INTERVAL 5 MINUTE vcluster default`(不是 `TARGET_LAG`)
5
5
  > - 修改调度周期或计算集群必须用 `CREATE OR REPLACE`,`ALTER` 不支持
6
- > - `ALTER DYNAMIC TABLE` 只支持:SUSPEND / RESUME / SET COMMENT / RENAME COLUMN
6
+ > - `ALTER DYNAMIC TABLE` 只支持:SUSPEND / RESUME / SET COMMENT / RENAME COLUMN / CHANGE COLUMN COMMENT / SET/UNSET PROPERTIES
7
+ > - 删除用 `DROP DYNAMIC TABLE`(不是 `DROP TABLE`)
8
+ > - 恢复用 `UNDROP TABLE`(不是 `UNDROP DYNAMIC TABLE`)
9
+ > - DESC 用 `DESC TABLE name`(不支持 `DESC DYNAMIC TABLE name EXTENDED`)
7
10
 
8
11
  动态表是 ClickZetta Lakehouse 的核心增量计算对象。通过 SQL 查询定义,自动增量刷新,无需手动调度。
9
12
 
@@ -16,23 +19,23 @@ CREATE [ OR REPLACE ] DYNAMIC TABLE <name>
16
19
  [ CLUSTERED BY (<col_name>) ]
17
20
  [ COMMENT <comment> ]
18
21
  [ PROPERTIES ( data_lifecycle = <day_num> ) ]
19
- REFRESH [ START WITH <timestamp_expr> ] interval <n> { SECOND | MINUTE | HOUR | DAY }
20
- VCLUSTER <vcluster_name>
22
+ REFRESH [ START WITH TIMESTAMP '<timestamp>' ] INTERVAL <n> { SECOND | MINUTE | HOUR | DAY }
23
+ vcluster <vcluster_name>
21
24
  AS
22
25
  <query>;
23
26
  ```
24
27
 
25
28
  **关键参数:**
26
- - `REFRESH interval <n> MINUTE`:刷新间隔,最小 1 分钟
27
- - `VCLUSTER`:运行刷新任务的计算集群名称(直接跟名称,不带等号和引号)
29
+ - `REFRESH INTERVAL <n> MINUTE`:刷新间隔,最小 1 分钟
30
+ - `vcluster`:运行刷新任务的计算集群名称(直接跟名称,不带等号和引号)
28
31
  - `OR REPLACE`:若同名动态表已存在则替换(修改 SQL 逻辑或调度配置必须用此方式)
32
+ - 建议使用 GP 型集群(如 `default`),AP 型集群不支持小文件合并
29
33
 
30
34
  **示例:**
31
35
  ```sql
32
36
  -- 基础示例:每 5 分钟刷新一次订单汇总
33
37
  CREATE OR REPLACE DYNAMIC TABLE dw.order_summary
34
- REFRESH interval 5 MINUTE
35
- VCLUSTER default
38
+ REFRESH INTERVAL 5 MINUTE vcluster default
36
39
  AS
37
40
  SELECT
38
41
  date_trunc('hour', created_at) AS hour,
@@ -44,8 +47,7 @@ GROUP BY 1, 2;
44
47
 
45
48
  -- 修改调度周期(必须用 CREATE OR REPLACE)
46
49
  CREATE OR REPLACE DYNAMIC TABLE dw.order_summary
47
- REFRESH interval 10 MINUTE
48
- VCLUSTER default
50
+ REFRESH INTERVAL 10 MINUTE vcluster default
49
51
  AS
50
52
  SELECT
51
53
  date_trunc('hour', created_at) AS hour,
@@ -66,17 +68,17 @@ ALTER DYNAMIC TABLE <name> SUSPEND;
66
68
  ALTER DYNAMIC TABLE <name> RESUME;
67
69
 
68
70
  -- 修改注释
69
- ALTER DYNAMIC TABLE <name> SET COMMENT <comment>;
71
+ ALTER DYNAMIC TABLE <name> SET COMMENT '<comment>';
70
72
 
71
73
  -- 修改列名
72
74
  ALTER DYNAMIC TABLE <name> RENAME COLUMN <old_col> TO <new_col>;
73
75
 
74
- -- 修改列注释
75
- ALTER DYNAMIC TABLE <name> CHANGE COLUMN <col_name> COMMENT <comment>;
76
+ -- 修改列注释(注意用 CHANGE COLUMN)
77
+ ALTER DYNAMIC TABLE <name> CHANGE COLUMN <col_name> COMMENT '<comment>';
76
78
 
77
79
  -- 修改属性
78
- ALTER DYNAMIC TABLE <name> SET PROPERTIES ( key = value );
79
- ALTER DYNAMIC TABLE <name> UNSET PROPERTIES ( key );
80
+ ALTER DYNAMIC TABLE <name> SET PROPERTIES ('key' = 'value');
81
+ ALTER DYNAMIC TABLE <name> UNSET PROPERTIES ('key');
80
82
  ```
81
83
 
82
84
  > 注意:修改调度周期、计算集群、SQL 查询逻辑,必须用 `CREATE OR REPLACE DYNAMIC TABLE`,ALTER 不支持这些操作。
@@ -91,7 +93,11 @@ REFRESH DYNAMIC TABLE <name>;
91
93
  ## DROP DYNAMIC TABLE
92
94
 
93
95
  ```sql
96
+ -- ⚠️ 必须用 DROP DYNAMIC TABLE,不能用 DROP TABLE
94
97
  DROP DYNAMIC TABLE [ IF EXISTS ] <name>;
98
+
99
+ -- 恢复已删除的动态表(⚠️ 用 UNDROP TABLE,不是 UNDROP DYNAMIC TABLE)
100
+ UNDROP TABLE <name>;
95
101
  ```
96
102
 
97
103
  ## SHOW / DESC
@@ -103,25 +109,27 @@ SHOW TABLES WHERE is_dynamic = true;
103
109
  -- 列出指定 schema 下的动态表
104
110
  SHOW TABLES IN <schema_name> WHERE is_dynamic = true;
105
111
 
106
- -- 查看动态表结构和调度配置
112
+ -- 查看动态表结构
107
113
  DESC TABLE <name>;
108
- DESCRIBE DYNAMIC TABLE <name> EXTENDED;
109
114
 
110
115
  -- 查看完整建表语句
111
116
  SHOW CREATE TABLE <name>;
112
117
 
113
118
  -- 查看刷新历史(状态、耗时、触发方式、增量行数)
114
- SHOW DYNAMIC TABLE REFRESH HISTORY <name>;
115
- SHOW DYNAMIC TABLE REFRESH HISTORY <name> LIMIT 20;
119
+ SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = '<dt_name>' LIMIT 20;
116
120
  ```
117
121
 
122
+ > ⚠️ **DESC 注意**:动态表用 `DESC TABLE name`,不支持 `DESC DYNAMIC TABLE name EXTENDED`(EXTENDED 会报错)。
123
+
118
124
  ## 注意事项
119
125
 
120
126
  - 修改 SQL 逻辑、调度周期、计算集群 → 用 `CREATE OR REPLACE`,不能用 `ALTER`
121
127
  - 刷新间隔最小 1 分钟
122
- - 动态表支持 Time Travel(`TIMESTAMP AS OF`)和 UNDROP
128
+ - 删除用 `DROP DYNAMIC TABLE`(不是 `DROP TABLE`)
129
+ - 恢复用 `UNDROP TABLE`(不是 `UNDROP DYNAMIC TABLE`)
123
130
  - 刷新失败不影响表的可查询性(返回上次成功版本的数据)
124
131
  - 非简单加列/减列的 `CREATE OR REPLACE` 会触发一次全量刷新
132
+ - 建议使用 GP 型集群(如 `default`),AP 型集群不支持小文件合并
125
133
 
126
134
  ## 参数化动态表(SESSION_CONFIGS)
127
135
 
@@ -130,8 +138,7 @@ SHOW DYNAMIC TABLE REFRESH HISTORY <name> LIMIT 20;
130
138
  ```sql
131
139
  -- 创建参数化动态表
132
140
  CREATE OR REPLACE DYNAMIC TABLE dwd.orders_partitioned
133
- REFRESH interval 30 MINUTE
134
- VCLUSTER default
141
+ REFRESH INTERVAL 30 MINUTE vcluster default
135
142
  AS
136
143
  SELECT order_id, user_id, amount, dt
137
144
  FROM ods.orders
@@ -146,18 +153,23 @@ REFRESH DYNAMIC TABLE dwd.orders_partitioned
146
153
 
147
154
  ## 动态表 DML 操作
148
155
 
149
- 动态表默认不支持 DML,需先开启参数:
156
+ 动态表默认不支持 DML,需先开启参数(每次 DML 前都需要 SET):
150
157
 
151
158
  ```sql
152
- -- 开启 DML 支持
153
- ALTER DYNAMIC TABLE <name> SET PROPERTIES ('cz.dynamic.table.enable.dml' = 'true');
154
-
155
- -- 支持的 DML 操作
159
+ -- ⚠️ 必须在同一会话/批次中先执行 SET,再执行 DML
160
+ SET cz.sql.dt.allow.dml = true;
156
161
  INSERT INTO <name> VALUES (...);
162
+
163
+ -- 删除
164
+ SET cz.sql.dt.allow.dml = true;
157
165
  DELETE FROM <name> WHERE ...;
158
166
  ```
159
167
 
160
- > ⚠️ 执行 DML 后,下一次自动刷新会触发**全量刷新**(而非增量),仅在数据修正等特殊场景使用。
168
+ > ⚠️ **DML 注意事项**:
169
+ > - `SET cz.sql.dt.allow.dml = true` 必须与 DML 语句在同一执行批次中
170
+ > - 执行 DML 后,下一次自动刷新会触发**全量刷新**(而非增量),可能耗时较长
171
+ > - UPDATE 可能因内部隐藏列(`MV__KEY`)报错,建议改用 DELETE + INSERT
172
+ > - 仅在数据修正等特殊场景使用 DML
161
173
 
162
174
  ## 参考文档
163
175