我有一个Python批处理作业,它基于提供的id执行SQL查询
ID的数量通常在20k以上。
查询为:
SELECT MY_ID, COL_A, COL_B FROM SOME_TABLE WHERE ID IN {dynamically_set_ids}
由于Oracle将IN
子句中的值数限制为1000,因此我将查询更新为:
WITH ids_list AS
(select id1 AS my_id FROM dual
UNION
select id2 AS my_id FROM dual ...) -- all 20k+ ids added like this
SELECT col_a,
col_b,
some_table.my_id
FROM some_table
join ids_list
ON ids_list.my_id = some_table.my_id
上述查询将在大约33分钟内执行
但是当我循环id列表并在循环中执行查询时:
con = get_con()
for i in range(calculated_iterations):
con.execute("select my_id, col_a, col_b where my_id in {0}".format(1k_or_less_ids))
# collect data
对于当前的数据量,上面的循环仅在大约40秒内返回预期数据
因此,问题是:是否建议/确定在循环中执行select?
绩效的提高并不重要,因为工作会在一夜之间完成。但是,对于这样的增益,循环会更可取吗
请注意,数据量无法猜测。它通常有数百万行。
20K'联合全选..'声明?无论运行时性能如何,这都是编码的疯狂!
"教科书式"的解决方案是将这20k个值放在一个文本文件中,在上面定义一个外部表,然后
SELECT MY_ID,
COL_A,
COL_B
FROM SOME_TABLE WHERE ID IN (select ext_id
from my_external_table)
;