我目前正在开发一个web服务,它将从数据库表中提取数据,并将其以XML格式发送到客户端。数据库中的表包含大量数据(数百万行)。因此,已经实现了分页和压缩算法,以便压缩数据并将其拆分为多个页面。
我的问题是,如果我调用某个查询
select t.*
from (select *
from table_name) t
where rownum > start_val
and rownum <= end_val在没有排序的情况下,每次执行相同的start_val和end_val时,获取的行的数据和顺序是否相同(如果数据库中没有添加新值)?
Edit:如果不是,那么从表中获取分页数据的更有效的方法是什么,因为现在我正在通过执行以下命令来获取数据
select t.*
from
(select *
from table_name
order by 1) t
where
rownum > start_val and rownum <= end_val对于每个页面,执行查询需要5-6分钟。
我对这些表具有只读访问权限。
发布于 2016-12-23 19:00:21
我认为如果你只有只读访问权限是没有办法的。你可以问一下parner (管理数据库)有没有编辑过那个表,能不能用户物化视图,oracle时间戳或者添加id。
发布于 2016-12-25 21:18:25
您的客户端可能不会翻页浏览所有百万条记录,因此,如果一个常见的场景是获取少于前100页的记录(假设每页10行),则可以对其进行优化。
我假设您的第一列(ORDER BY 1)是COL1
找到一个值COL1,比如在表中,至少有1000行具有较小的值。在我的例子中,它是值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;https://stackoverflow.com/questions/41299462
复制相似问题