多个查询与巨大的WHERE IN

时间:2016-02-29 11:53:44

标签: sql vba db2

我必须根据ID数组从数据库(DB2)中选择一堆行。但是,由于行数可能会变得相当大(最多7,000),因此多行查询(如下所示)将在VBA中降至30秒超时。我反而考虑采用循环单行方法,但我不知道这会给数据库带来多大的压力。

循环单行查询是否是一种鲁莽的方法?有没有更好的解决方案,没有写入数据库?

多行:

SELECT * FROM my_table WHERE my_table.id IN ('0001', '0002', '0003', ...)

单排:

DECLARE @cnt INT = 0;
WHILE @cnt < cnt_total
   SELECT * FROM my_table WHERE my_table.id = @cnt
   SET @cnt = @cnt + 1;
END;

3 个答案:

答案 0 :(得分:3)

由于往返次数的原因,7000次通话将非常缓慢。

解决此问题的最佳方法是创建一个临时表,用7000行填充它,并在查询中加入它。

如果这种方法不可接受,您可以通过在循环中一次查询1000行来限制往返次数。这将给你七次往返而不是7000,这应该快得多。

答案 1 :(得分:2)

循环单行查询更加鲁莽。好吧,至少它也没有表现出来。

通常,执行查询会产生开销。数据库引擎至少需要解析查询,确定查询计划(可以传递),执行查询并返回结果。重复这些步骤需要额外的努力。

从绩效角度来看,IN是一种更好的方法。

也就是说,在应用程序层逐行处理代码可能更容易。如果您只有少数几个值,性能差异可能不是很重要。但是,更好的方法是单个查询。

答案 2 :(得分:1)

使用BETWEEN查询:

<button>Foo</button>
<button>Bar</button>

根据您为单行查询显示的代码,似乎ID值是连续的,具有已知的起始值和结束值。鉴于此,一个返回您正在寻找的所有行的查询是一个更好的主意。

祝你好运。