查询调优

最近更新时间:2026-05-06 16:28:12

我的收藏
本指南旨在帮助数据工程师与分析师优化在 TCHouse-X 上的查询性能。通过理解 Horn 自研优化器 的工作原理、掌握诊断工具及遵循最佳实践,您可以显著降低查询延迟并提升系统并发能力。

核心机制:统计信息与 CBO

TCHouse-X 的 Horn 优化器 采用基于成本的优化模型(CBO, Cost-Based Optimizer)。它通过分析表的数据量、列基数(Cardinality)及数据分布,决定最优的执行路径(如 Join 顺序、Broadcast vs Shuffle 策略等)。
警告:
没有统计信息,CBO 将无法生效,系统仅能回退到基础的规则优化(RBO),这通常会导致性能大幅下降。

统计信息收集 (COMPUTE STATS)

在创建新表、全量导入或增量数据变更显著后,必须手动收集统计信息,以防优化器因误判导致内存溢出 (OOM) 或全表扫描。

语法示范


-- 收集统计信息
COMPUTE STATS customer;

-- 查看表级摘要(行数、文件数、格式)
SHOW TABLE STATS customer;

-- 查看列级详情(基数、空值数、平均长度)
SHOW COLUMN STATS customer;

何时需要重新收集

首次加载:数据入库后立即执行。
显著变更:当数据增量超过总量的 20% 时。
性能回退:原本正常的查询突然变慢,首选排查统计信息是否过期。

高级 SQL 优化最佳实践

编写准则

精简字段:严禁 SELECT *,仅读取必要列以减少 I/O 和内存占用。
谓词下推:虽然 CBO 支持自动下推,但在复杂子查询中,显式添加过滤条件更稳健。
类型匹配:避免隐式转换(如 string_col = 123),这会导致索引失效及额外的 CPU 开销。

Join 与聚合调优

大表 Join 小表:确保小表统计信息准确,优先触发 Broadcast Join。
倾斜处理:对存在大量 NULL 或热点值的 Join Key,建议先进行过滤或加随机盐(Salt)打散。
去重策略:在高基数列上,GROUP BY 的并行处理性能通常优于 DISTINCT

存储辅助

分区裁剪:查询条件必须包含分区键,避免全表扫描。
小文件治理:定期合并小文件,提升 Scan 阶段的吞吐量。