在单个查询中,我正在尝试在数据库视图上实现抽取(视图的大小范围为10 ^ 7个元素)。为此,我试图选择结果集中的每个第N个元素。目前,我的实现是正确的,但非常慢(2-3秒),我正在寻找更快的替代方案。
现在我选择带有行号的结果集,用每个元素的mod值选择结果集,最后从结果集中选择所有元素,其中mod值等于0或者rownumber等于总计数(要检索最后一个元素)。要找到Mod值,我需要获得初始结果集的总大小并除以1000(我们将1000作为固定数量抽取)。
SELECT * FROM (
SELECT id, age, sex, height, weight, attendence_time,
EXP1.rownum, MOD(INITIAL.rownum-1, CEIL(COUNT(*) OVER () /1000)) AS person_mod
FROM (
SELECT id, age, sex, height, weight, attendence_time,
ROW_NUMBER() OVER(ORDER BY attendence_time) AS rownum
FROM person p
WHERE p.age = :age
) INITIAL
) MODROW WHERE MODROW.person_mod = 0 OR rownum = (
SELECT COUNT(*)
FROM person p
WHERE p.age = :age
)
我已经调查了NTILE,虽然我可以使用它将我的结果集分成基于rownumber的1000个组,但我不确定如何从每个组中获取第一个元素以获得抽取的响应
是否有任何关于如何提高效率的建议?
由于我有一个Java后端,返回初始大型结果集并用Java进行抽取会更好吗?
注意我正在使用带有JPA / JPQL的Oracle SQL。