我们的小组经常遇到这样的情况:我们需要将我们的表加入来自数据库外部的标识符,例如:下载具有在公共数据存储库中找到的匹配关联的数据。
我知道基本的两种方法。我们最常使用的那个涉及批处理IN子句。当我们加入> 1000个项目时,我们有一个实用程序可以在单独的查询中透明地包装长IN语句。
有5个项目,批次限制为4个查询:
SELECT foo.id, foo.data FROM foo WHERE foo.id IN ($MANY)
变为:
SELECT foo.id, foo.data FROM foo WHERE foo.id IN (?,?,?,?)
SELECT foo.id, foo.data FROM foo WHERE foo.id IN (?)
这种方法有效,但看起来很笨拙。
有时使用的替代方法包括创建临时表,插入值以及连接普通表。对于最终查询,此解决方案似乎更加标准,因为您只是像数据在数据库中一样加入。但是,临时表创建似乎不能以符合ANSI SQL的方式完成。
性能似乎与IN方法大致相同,因为预期很少有外部价值。
以ANSI标准方式解决此问题的最佳做法是什么?
编辑: 关于性能测量,我们对应用程序代码进行了基准测试。这包括插入临时表的开销。同样,对于IN子句,它包括批量处理的开销。
答案 0 :(得分:0)
在这种特殊情况下,由于您只是按ID匹配,因此使用IN子句的解决方案是最佳方法,并且它比连接更有效。一个连接,即使在这个简单的情况下,你的临时表只有id,总是会产生比IN子句更大的开销。如果两个选项似乎在你的系统上以相同的速度运行是因为你有几千个id的数量级的小表,但如果你增加临时表中的记录数,IN子句总是会赢。
我的2美分