SQL查询数据排序

时间:2016-12-23 10:17:20

标签: sql database oracle

我目前正在开发一个Web服务,它将从数据库表中获取数据并以XML格式将其发送到客户端。数据库中的表包含大量数据(数百万行)。因此,已经实现了分页和压缩算法,因此数据被压缩并分成多个页面。

我的问题是,如果我打电话给某些查询说

select t.* 
from (select * 
      from table_name) t 
where rownum > start_val 
  and rownum <= end_val

多次没有排序,每次执行同一start_valend_val时,如果数据库中没有添加新值,那么每次执行的行的数据和顺序是否相同? / p>

编辑:如果没有,那么现在从表中获取分页数据的更有效方法是通过执行

来获取数据
select t.* 
from 
    (select * 
     from table_name 
     order by 1) t 
where 
    rownum > start_val and rownum <= end_val

对于每个页面,查询需要5-6分钟才能执行。

我对表格具有只读权限。

2 个答案:

答案 0 :(得分:0)

我认为如果您拥有只读访问权限,就没有办法。你可以要求parner(管理数据库)有一些编辑表,可以用户物化视图,oracle时间戳或添加id。

答案 1 :(得分:0)

您的客户可能不会翻阅所有百万条记录,因此如果经常情况是要说少于前100页(假设每页10行) 你可以优化它。

我假设您的第一列(ORDER BY 1)为COL1

查找COL1的值,例如表中的值至少为1000行,其值为smaler。 就我而言,它是值201110

select count(*) from myTab where col1 < 201110;
 COUNT(*)
----------
      1000 

请注意,1000行覆盖100页,每行10行。 现在,您可以使用以下查询优化前100页的访问权限:

SELECT  
    col1, col2, rownum rn
FROM myTab
where col1 < 201110
order by id
)
select * from page
where rn > 10 and rn <= 20
;

关键部分是

 FROM myTab
 where col1 < 201110

即使col1中没有索引并且您将被迫执行FTS,您将仅对1000条记录进行排序,而不是对数百万条进行排序。

请注意,排序与全面扫描相比非常昂贵,因此限制排序是关键。

同样从12c开始,您可以使用OFFSET子句进行分页

SELECT  
    col1, col2 
FROM myTab
where col1 < 201110
order by col1
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;