首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL seq扫描而不是主键

PostgreSQL seq扫描而不是主键
EN

Database Administration用户
提问于 2022-08-30 13:26:30
回答 1查看 90关注 0票数 0

我有张桌子上有电子邮件:

代码语言:javascript
运行
复制
email
 - id : numeric, primary key
 - id_in_target : text, the ID as stored in Google/MS, indexed
 - in_reply_to : nullable, text, references id_in_target in case of a reply, indexed
 - ts : timestamp, email's timestamp
 ... some other columns

给定一个电子邮件ID列表,我试图获取受电子邮件ID列表影响的所有回复或源电子邮件。因此,电子邮件表是与自己连接的。查询有以下形式:

代码语言:javascript
运行
复制
select reply.id, extract(epoch from (source.ts - reply.ts))
from email source
join email reply on source.id_in_target = reply.in_reply_to
where source.id in (ids) or reply.id in (ids)

问题在于主键上的OR条件。如果我只选择源或回复,优化器将使用主键。但是,在OR条件下,计划者选择扫描整个表。我知道我可以用union“复制”查询,但我只是不明白为什么它会选择次优方案,而这显然是一个主要的关键条件。

EN

回答 1

Database Administration用户

发布于 2022-08-30 16:53:42

这是因为OR。PostgreSQL不能自动将查询重写为两个查询的UNION,因为它不能证明结果是相同的:带有OR的查询可以返回两个相同的结果行,而UNION查询不能。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/316225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档