我们小组经常遇到需要根据来自数据库外部的标识符加入表的情况,例如下载公共数据存储库中的匹配关联数据。
我知道基本的两种方法。我们最常用的一个涉及批处理 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 子句,它包括批处理它们的开销。