sql - 为什么 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
?
解决方案
您链接到的小提琴显示行估计,而不是实际行数。因此,您无法从中看出数据库在执行期间在幕后实际做了什么。
如果我们添加代码来检查列表中的重复项,那么该代码将运行并占用每个人的 CPU 周期,即使对于不编写痴呆查询的人也是如此。这通常不是我们想要做出的权衡。
推荐阅读
- xml - 在 UFT(VB 脚本)中尝试时未加载 XML 文件
- ionic-framework - IOS上的MediaDevices.getUserMedia(),离子的android本机应用程序?
- android - firestore 在无限循环中不断更新
- database - 从 t2 的图像(BLOB)更新 t1 的图像(BLOB 列)
- android - 如何检测EditBox是否为空
- wordpress - nginx 入口 FCGI + wordpress:fpm-alpine。302重定向无限循环
- python - 如何在 Python 中对嵌套对象进行类型提示?
- reactjs - 了解 axios 在 react native 中的工作原理
- google-sheets - 如何为一个范围(如循环)运行公式并对结果求和?
- javascript - Jquery 无法向 Mozilla Firefox 中的元素添加类