选择N为动态的每第N行

时间:2018-01-16 16:59:43

标签: sql oracle-sqldeveloper sql-optimization

在单个查询中,我正在尝试在数据库视图上实现抽取(视图的大小范围为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。

0 个答案:

没有答案