TRUNCATE TABLE 用于高效地清空表中的所有数据,同时保留表的定义(Schema)和结构。语法
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) |
性能 | 极高(直接物理删除文件) | 较低(逐行或按主键范围删除) |
主键要求 | 无要求,支持各类表 | 仅支持主键表 |
统计信息 | 自动重置 | 保留统计信息(需手动重置) |