是否建议在Oracle执行循环查询与一次性执行查询以获得显著的性能提升



我有一个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)
;

最新更新