多个查询与巨大的 WHERE IN
Multiple queries vs. huge WHERE IN
我必须 select 基于 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;
单行循环查询比较鲁莽。好吧,至少它没有那么好。
通常,执行查询会产生开销。至少,数据库引擎需要解析查询、确定查询计划(可能会通过)、执行查询和 return 结果。重复此步骤需要额外的努力。
从性能的角度来看,IN
是更好的方法。
也就是说,在应用层逐行处理代码可能会更容易。如果您只有少数几个值,则性能差异可能不是很重要。但是,更好的方法是单个查询。
7000 次调用会很慢,因为往返次数多。
解决此问题的最佳方法是创建一个临时的 table,用 7000 行填充它,并在您的查询中加入它。
如果这种方法不被接受table,您可以通过在一个循环中一次查询 1000 行来限制往返次数。这将为您提供七次往返而不是 7000 次,这应该快得多。
使用 BETWEEN 查询:
SELECT *
FROM my_table
WHERE my_table.id BETWEEN '0001' AND '7000';
鉴于您为单行查询显示的代码,ID 值似乎是连续的,具有已知的起始值和结束值。鉴于此,一个 returns 您要查找的所有行的查询是一个更好的主意。
祝你好运。
我必须 select 基于 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;
单行循环查询比较鲁莽。好吧,至少它没有那么好。
通常,执行查询会产生开销。至少,数据库引擎需要解析查询、确定查询计划(可能会通过)、执行查询和 return 结果。重复此步骤需要额外的努力。
从性能的角度来看,IN
是更好的方法。
也就是说,在应用层逐行处理代码可能会更容易。如果您只有少数几个值,则性能差异可能不是很重要。但是,更好的方法是单个查询。
7000 次调用会很慢,因为往返次数多。
解决此问题的最佳方法是创建一个临时的 table,用 7000 行填充它,并在您的查询中加入它。
如果这种方法不被接受table,您可以通过在一个循环中一次查询 1000 行来限制往返次数。这将为您提供七次往返而不是 7000 次,这应该快得多。
使用 BETWEEN 查询:
SELECT *
FROM my_table
WHERE my_table.id BETWEEN '0001' AND '7000';
鉴于您为单行查询显示的代码,ID 值似乎是连续的,具有已知的起始值和结束值。鉴于此,一个 returns 您要查找的所有行的查询是一个更好的主意。
祝你好运。