首页 > 解决方案 > 为什么 postgres 选择 WHERE IN(..) 的低效解析?

问题描述

我正在使用 ORM,它在某些情况下会生成以下查询:

SELECT * FROM test WHERE id IN(1,1,1)

事实证明,postgresql(或者更确切地说,postgres 的优化器)不理解这样的IN查询基本上评估WHERE id = 1并查找三行。您可以通过this fiddle 中View Execution Plan的功能看到这种行为。

即使所有IN条件都指向不存在的实体,情况也是如此:小提琴

像 Oracle 或 MySQL 等其他 DBMS 正确(小提琴)所以我不认为这是无法实现的。

显然,这是应该在 orm 级别解决的问题,但这让我开始思考:

由于 Postgresql 通常是一个非常好的 dbms,所以 postgres 选择以他们的方式实现查找可能是有充分理由的?或者也许这并不像看起来那样低效EXPLAIN

标签: sqlpostgresql

解决方案


您链接到的小提琴显示行估计,而不是实际行数。因此,您无法从中看出数据库在执行期间在幕后实际做了什么。

如果我们添加代码来检查列表中的重复项,那么该代码将运行并占用每个人的 CPU 周期,即使对于不编写痴呆查询的人也是如此。这通常不是我们想要做出的权衡。


推荐阅读