2

我们小组经常遇到需要根据来自数据库外部的标识符加入表的情况,例如下载公共数据存储库中的匹配关联数据。

我知道基本的两种方法。我们最常用的一个涉及批处理 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 子句,它包括批处理它们的开销。

4

1 回答 1

0

在这种特殊情况下,由于您仅按 ID 进行匹配,因此使用 IN 子句的解决方案是最好的方法,它比连接更有效。即使在这种简单的情况下,如果您的临时表只有 id,连接也总是会导致 IN 子句的显着开销。如果这两个选项似乎在您的系统上以相同的速度运行是因为您的表非常小,大约为几千个 id,但是如果您增加临时表中的记录数,则 IN 子句将始终获胜。

我的 2 美分

于 2013-11-01T18:12:52.983 回答