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
相关产品推荐
相关产品推荐

