首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询数据排序

SQL查询数据排序
EN

Stack Overflow用户
提问于 2016-12-23 18:17:20
回答 2查看 99关注 0票数 0

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

我的问题是,如果我调用某个查询

代码语言:javascript
复制
select t.* 
from (select * 
      from table_name) t 
where rownum > start_val 
  and rownum <= end_val

在没有排序的情况下,每次执行相同的start_valend_val时,获取的行的数据和顺序是否相同(如果数据库中没有添加新值)?

Edit:如果不是,那么从表中获取分页数据的更有效的方法是什么,因为现在我正在通过执行以下命令来获取数据

代码语言:javascript
复制
select t.* 
from 
    (select * 
     from table_name 
     order by 1) t 
where 
    rownum > start_val and rownum <= end_val

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

我对这些表具有只读访问权限。

EN

回答 2

Stack Overflow用户

发布于 2016-12-23 19:00:21

我认为如果你只有只读访问权限是没有办法的。你可以问一下parner (管理数据库)有没有编辑过那个表,能不能用户物化视图,oracle时间戳或者添加id。

票数 0
EN

Stack Overflow用户

发布于 2016-12-25 21:18:25

您的客户端可能不会翻页浏览所有百万条记录,因此,如果一个常见的场景是获取少于前100页的记录(假设每页10行),则可以对其进行优化。

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

找到一个值COL1,比如在表中,至少有1000行具有较小的值。在我的例子中,它是值201110

代码语言:javascript
复制
select count(*) from myTab where col1 < 201110;
 COUNT(*)
----------
      1000 

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

代码语言:javascript
复制
SELECT  
    col1, col2, rownum rn
FROM myTab
where col1 < 201110
order by id
)
select * from page
where rn > 10 and rn <= 20
;

最关键的部分是

代码语言:javascript
复制
 FROM myTab
 where col1 < 201110

即使col1中没有索引,您也会被迫执行FTS,您将只对1000条记录进行排序,而不是对整个数百万条进行排序。

请注意,与完全扫描相比,排序的开销要大得多,因此限制排序是关键。

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

代码语言:javascript
复制
SELECT  
    col1, col2 
FROM myTab
where col1 < 201110
order by col1
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41299462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档