我必须根据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;
答案 0 :(得分:3)
由于往返次数的原因,7000次通话将非常缓慢。
解决此问题的最佳方法是创建一个临时表,用7000行填充它,并在查询中加入它。
如果这种方法不可接受,您可以通过在循环中一次查询1000行来限制往返次数。这将给你七次往返而不是7000,这应该快得多。
答案 1 :(得分:2)
循环单行查询更加鲁莽。好吧,至少它也没有表现出来。
通常,执行查询会产生开销。数据库引擎至少需要解析查询,确定查询计划(可以传递),执行查询并返回结果。重复这些步骤需要额外的努力。
从绩效角度来看,IN
是一种更好的方法。
也就是说,在应用程序层逐行处理代码可能更容易。如果您只有少数几个值,性能差异可能不是很重要。但是,更好的方法是单个查询。
答案 2 :(得分:1)
使用BETWEEN查询:
<button>Foo</button>
<button>Bar</button>
根据您为单行查询显示的代码,似乎ID值是连续的,具有已知的起始值和结束值。鉴于此,一个返回您正在寻找的所有行的查询是一个更好的主意。
祝你好运。