【发布时间】:2014-05-07 16:20:43
【问题描述】:
我发现 SQLAlchemy 可以翻译
db.query(...).filter(A.id.in_(ids))
进入
SELECT ...
FROM a
WHERE a.id != a.id
如果ids 为空。这会导致对a 表的顺序扫描,这对性能显然是灾难性的。
第一个问题是:为什么?为什么不只是 1 = 0 或任何不需要顺序扫描的东西?
第二个,更重要的是:是否有常用的解决方法(除了每个in_ 附近的if)?
我猜想 in_ 不能轻易地重新实现以涵盖所有情况而不会导致该问题,但我不能第一个面对它,并且可能有一些解决方案涵盖 in_ 的简单、常见用例。
编辑
SQLAlchemy 每次发生时都会记录一个警告:
"The IN-predicate on 'foo.bar' was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate. Consider alternative strategies for improved performance."
【问题讨论】:
-
关于该主题的有趣文章:Handling empty WHERE IN clauses in DBALs.
-
对我有用的简单、常见的用例解决方案是 if 语句。您可能正在(或应该)进行某种验证。只需将空列表添加到您的检查中,不要浪费数据库开销。
-
@LukasGraf 那个链接失效了,文章现在是here
标签: python sql sqlalchemy