我目前正在开发一个Web服务,它将从数据库表中获取数据并以XML格式将其发送到客户端。数据库中的表包含大量数据(数百万行)。因此,已经实现了分页和压缩算法,因此数据被压缩并分成多个页面。
我的问题是,如果我打电话给某些查询说
select t.*
from (select *
from table_name) t
where rownum > start_val
and rownum <= end_val
多次没有排序,每次执行同一start_val
和end_val
时,如果数据库中没有添加新值,那么每次执行的行的数据和顺序是否相同? / p>
编辑:如果没有,那么现在从表中获取分页数据的更有效方法是通过执行
来获取数据select t.*
from
(select *
from table_name
order by 1) t
where
rownum > start_val and rownum <= end_val
对于每个页面,查询需要5-6分钟才能执行。
我对表格具有只读权限。
答案 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;