一、语法
TRUNCATE [TABLE] [IF EXISTS] [db_name.]table_name
二、使用说明
·核心用途:常用于 ETL 流程中清空中间表或临时表。相比于删除并重建表,或使用 INSERT OVERWRITE,TRUNCATE 是一种低开销、高性能的方法。
·适用范围:
·删除表中的所有数据及其相关的物理数据文件。
·支持内表、外表、分区表。
·操作适用于全表,会自动处理所有分区的数据。
·副作用:执行后,由 COMPUTE STATS 生成的所有表统计信息和列统计信息将被重置(清空)。
·安全建议:
·在执行前确保位于正确的数据库(使用 USE 切换),或使用全限定名(db.table)。
·IF EXISTS:此子句可防止因表不存在而报错,非常适合放在自动化脚本或标准化 ETL 设置脚本中。
·可选关键字:TABLE 关键字是可选的,不影响执行逻辑。
三、清空数据并重置统计信息
以下示例展示了 TRUNCATE 如何在清空数据的同时重置统计信息。
— 1. 准备数据并收集统计信息CREATE TABLE truncate_demo (x INT);INSERT INTO truncate_demo VALUES (1), (2), (4), (8);– TCHouse-X 数据写入后可见性约为 10s,建议至少等待 10s 后再执行后续操作。COMPUTE STATS truncate_demo;– 查看统计信息:此时有 4 行数据SHOW TABLE STATS truncate_demo;– +——-+——–+——+——–+– | #Rows | #Files | Size | Format |– +——-+——–+——+——–+– | 4 | 1 | 420B | TCI |– +——-+——–+——+——–+– 2. 执行清空操作TRUNCATE TABLE truncate_demo;– 3. 验证结果:数据和统计信息均被清空SELECT COUNT(*) FROM truncate_demo; — 返回 0SHOW TABLE STATS truncate_demo;– +——–+——–+——+——–+– | #Rows | #Files | Size | Format |– +——–+——–+——+——–+– | -1 | 0 | 0B | TCI |– +——–+——–+——+——–+
四、在自动化脚本中使用 IF EXISTS
该子句允许脚本在表可能不存在的情况下继续运行而不中断。
— 即使 staging_table2 和 3 不存在,脚本也不会报错TRUNCATE TABLE IF EXISTS staging_table1;TRUNCATE TABLE IF EXISTS staging_table2;TRUNCATE TABLE IF EXISTS staging_table3;
五、TRUNCATE vs DELETE 快速对比
| 特性 | TRUNCATE TABLE | DELETE |
| 操作粒度 | 全表清空 | 可根据条件精确删除 (WHERE) |
| 性能 | 极高(直接物理删除文件) | 较低(逐行或按主键范围删除) |
| 主键要求 | 无要求,支持各类表 | 仅支持主键表 |
| 统计信息 | 自动重置 | 保留统计信息(需手动重置) |