OPTIMIZE 命令

概述

OPTIMIZE 类似于传统数据库的 VACUUM 操作——它将多个小文件合并为大文件,加速后续查询,但不改变表中的数据内容本身。

OPTIMIZE 是 ClickZetta Lakehouse 中用于表数据优化和压缩的核心操作命令。通过整合小文件、清理删除标记和重组数据布局,可以显著改善查询性能和存储效率。虽然 Lakehouse 后台会默认定期自动执行文件合并,但在频繁更新或需要精细控制合并频率的场景中,用户可以通过手动调用该命令来满足特定业务需求。该命令支持异步和同步两种执行模式,为不同场景提供灵活的优化方案。

命令语法

OPTIMIZE table_name [WHERE predicate] -- 可选分区过滤条件 [OPTIONS(...)]

  1. table_name(必选)
  • 需要优化的目标表名称,格式为 
    [schema_name.]table_name
    [schema_name.]table_name
  1. WHERE predicate(可选)
  • 分区过滤条件,必须包含完整的分区列匹配条件
  • 支持格式:
    partition_column = 'value'
    partition_column = 'value'
     或复合分区 
    dt='2023-01-01' AND region='us'
    dt='2023-01-01' AND region='us'
  1. OPTIONS(可选)
  • Lakehouse 保留参数,用于控制优化行为。

注意事项

  • 该功能只能在**通用型计算集群(GENERAL PURPOSE VIRTUAL CLUSTER)**中运行,在分析型集群中该功能不会生效。

核心功能

  • 小文件合并:将多个小数据文件整合为大文件,减少文件元数据开销。
  • 删除标记清理:清理 UPDATE/DELETE 操作产生的删除标记,回收存储空间。
  • 数据重组:重新整理数据布局,提升查询性能。

执行模式

1. 异步执行模式(默认)

异步执行是 OPTIMIZE 的默认行为,操作在后台进行,不阻塞当前连接。

特点

  • 非阻塞:立即返回 Job ID,操作在后台执行。

语法

-- 默认异步执行 OPTIMIZE table_name; -- 显式指定异步执行 OPTIMIZE table_name OPTIONS('cz.sql.optimize.table.async' = 'true');

2. 同步执行模式

同步执行会阻塞当前连接,直到优化操作完全完成后才返回结果。

特点

  • 阻塞式:操作完成才返回,期间连接被占用。
  • 实时反馈:立即获得详细的执行统计和成功状态。
  • 适用场景:开发测试、小表优化、验证优化效果。
  • 确定性:确保操作完全完成。

语法

OPTIMIZE table_name OPTIONS('cz.sql.optimize.table.async' = 'false');

使用示例

示例 1:对整张表执行异步优化(默认)

OPTIMIZE doc_test.orders;

异步模式立即返回,优化任务在后台执行。若表文件已足够紧凑,返回:

No compaction job generated

若触发了合并任务,返回 Job ID,可通过

SHOW JOBS
SHOW JOBS
查看进度。

示例 2:对指定分区执行同步优化

doc_test.orders
doc_test.orders
order_date
order_date
分区,可针对单个分区执行同步优化:

OPTIMIZE doc_test.orders WHERE order_date = '2024-02-05' OPTIONS('cz.sql.optimize.table.async' = 'false');

同步模式阻塞直到操作完成,返回结果示例:

No compaction job generated

示例 3:对整张表执行同步优化

OPTIMIZE doc_test.orders OPTIONS('cz.sql.optimize.table.async' = 'false');

适用场景

  • 大量 UPDATE/DELETE 操作后的存储清理
  • 释放临时存储空间的定期维护任务
  • 优化表的总体存储布局

相关指南

  • 小文件合并优化:何时需要执行 OPTIMIZE、合并策略选择、与自动优化的配合使用

相关指南

  • 小文件合并优化:何时需要执行 OPTIMIZE、合并策略选择、与自动优化的配合使用
联系我们
预约咨询
微信咨询
电话咨询