为什么 PostgreSQL 使用 UUID 进行 ORDER BY 和 LIMIT 这么慢?

问题描述 投票:0回答:2

我的请求有问题。我有一个表,其中

id
是 UUID,并且我有一个类似

的查询
SELECT * FROM table
WHERE fk = ?
ORDER BY id ASC
LIMIT 5;

这个查询运行了大约 50 秒,但是如果我删除

ORDER BY id
,这个查询运行时间为 0.3 秒。但如果我使用一些同时也是 UUID 的
fk
ORDER BY fk
工作速度很快。

postgresql query-optimization
2个回答
1
投票

有了这些信息,我只能猜测优化器选择使用支持

ORDER BY
的索引,徒劳地希望快速找到足够的结果行。

您可以禁用该策略

ORDER BY id ASC NULLS FIRST

除非您使用

NULLS FIRST
创建索引,否则默认情况下会使用
NULLS LAST
创建索引。但即使没有 NULL 值,PostgreSQL 也不会考虑使用
NULLS LAST
为带有
ORDER BY
NULLS FIRST
子句创建的索引。


1
投票

第一个查询(但不是第二个)中存在的

ORDER BY
子句向查询管道添加了额外的排序步骤。 对于中等大小的表,这种排序可能需要一些时间,特别是如果您的查询没有任何索引方案来使其运行得更快。 您当前的观察结果是预期的。

© www.soinside.com 2019 - 2024. All rights reserved.