

新闻资讯
行业动态计算下推是将过滤、聚合等计算逻辑下沉至存储层或执行引擎底层执行,以减少网络传输、内存占用和中间结果集;典型场景包括WHERE条件、聚合函数及UDF下推,ClickHouse、StarRocks等支持较好,需通过执行计划确认是否生效。
SQL数据库中的计算下推(Computation Pushdown)是一种优化技术,核心是把本该在应用层或数据库服务端内存中做的计算,尽可能提前到存储层或执行引擎底层完成,从而减少网络传输、内存占用和中间结果集大小。
传统SQL执行流程中,数据库先读取原始数据(比如全表扫描),再在服务端逐行做过滤、聚合、函数计算等操作,中间可能生成大量临时数据。而计算下推会把部分逻辑“下沉”到更靠近数据的地方执行——例如下推到存储引擎(如TiKV、Delta Lake)、列存格式解析层(如Parquet reader)、甚至磁盘I/O路径中。
典型场景包括:
• WHERE条件中的函数下推:如WHERE year(order_time) = 2025,若底层支持,可直接在扫描时跳过非2025年的数据块。
• 聚合函数下推:COUNT/SUM/AVG等在分区或文件级别预聚合,减少向上汇总的数据量。
• UDF(用户自定义函数)下推:某些引擎(如Trino+Iceberg、Spark on Delta)支持将轻量UDF编译后下发到读取端执行。
中间结果集变大,往往不是因为最终结果多,而是因为执行过程中保留了太多冗余行或列。计算下推通过“早筛早算”,从源头压缩数据流:
price * tax_rate)→ 在读取时完成运算,避免存储原始字段+额外计算两步开销
全量拉取再截断支持程度取决于存储格式、执行模型与优化器能力:
spark.sql.parquet.filterPushdown等配置)关键看执行计划中是否体现“pushed down”或类似语义:
EXPLAIN SYNTAX或EXPLAIN PIPELINE查看filter/project是否出现在ReadFromMergeTree阶段EXPLAIN VERBOSE中观察Predicate是否标记为PushedDown
EXPLAIN (TYPE DISTRIBUTED)里看TableScan节点的Filter和Layout字段是否含下推条件EXPLAIN FORMATTED中查找PushedFilters和ReadSchema,确认列与过滤是否精简如果执行计划显示“Filter: (col > 100)”出现在Scan节点内部,大概率已下推;若只在Exchange或HashAggregate之后出现,则未下推。
不复杂但容易忽略:写SQL时尽量让过滤条件干净(避免WHERE UPPER(name) = 'ABC'这种破坏索引/下推的写法),并确保统计信息及时更新——这是触发下推的前提。