You need to enable JavaScript to run this app. Postgres执行最简主键等值查询为何走顺序扫描而非索引扫描
优惠活动
大模型
产品
解决方案
定价
更多

Postgres执行最简主键等值查询为何走顺序扫描而非索引扫描

问题原因

这一现象的核心是PostgreSQL对函数稳定性级别的处理规则:

  • uuid_generate_v4() 属于*VOLATILE(不稳定)*类型的函数,官方定义是该类函数在同一次查询的执行过程中,每次调用都会返回不同的结果,且结果无法提前预测。
  • 如果你用常量、或者STABLE/IMMUTABLE类型的函数作为等值匹配条件,优化器会先计算得到固定的匹配值,再通过主键索引做定点查找,成本极低。但对于VOLATILE类型的函数,优化器不能提前计算一次值就复用:这不符合VOLATILE函数的语义要求,PostgreSQL必须逐行比对时都重新执行uuid_generate_v4()生成新的UUID再和当前行的id对比,自然无法使用索引做定点查询,只能走全表扫描逐行过滤。

你可以做个简单的验证,把查询改成下面的写法,让uuid_generate_v4()只执行一次得到固定值,就能看到优化器选择索引扫描了:

explain analyze select * from test where id = (select uuid_generate_v4());

内容的提问来源于stack exchange,提问作者Miguel Oller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 20:45:08