You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析PostgreSQL QUERY PLAN提取chunk扫描行数实现hypertable行数估算

问题原因

你编写的函数存在三个核心错误:

  • 没有累加逻辑,每次循环都会直接覆盖rows变量,最终只会保留最后一次提取到的数值
  • 没有过滤执行计划行,所有行都会尝试提取rows值,而执行计划末尾的索引条件、过滤条件相关行不存在rows关键字,substring会返回null,最终输出自然为null
  • 没有针对性匹配Index Scan节点,会把顶层ChunkAppend等无关节点的估算值纳入计算,不符合你累加单chunk估算值的需求
解决方案

使用下面的函数即可实现需求:遍历所有Index Scan节点,累加每个节点的估算行数:

CREATE or replace FUNCTION count_estimate(query text) RETURNS bigint AS $$
declare
  total_rows bigint := 0;
  rec   record;
  cur_chunk_rows integer;
BEGIN
  FOR rec IN EXECUTE 'EXPLAIN ' || query loop
    -- 仅匹配每个chunk对应的Index Scan节点行
    IF rec."QUERY PLAN" LIKE '->  Index Scan%' THEN
        cur_chunk_rows := substring(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)')::integer;
        total_rows := total_rows + cur_chunk_rows;
    end IF;
  END LOOP;
  RETURN total_rows;
END;
$$ LANGUAGE plpgsql VOLATILE STRICT;

该函数代入你给出的第二个执行计划示例时,会匹配到两条Index Scan记录,分别提取19017和32369累加得到51386,和你预期的输出一致。

内容的提问来源于stack exchange,提问作者Tim Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:57:03