当前位置: 首页 > 知识库问答 >
问题:

Oracle11g带分页的select查询

姬天逸
2023-03-14

在尝试从oracle11g数据库获取分页对象列表时,我面临一个很大的性能问题。

据我所知,以及我在网上查过的情况,在oracle11g中实现分页的唯一方法如下:示例:[页面=1,大小=100]

SELECT * FROM
  (
    SELECT pagination.*, rownum r__  FROM
      (
         select * from "TABLE_NAME" t
         inner join X on X.id = t.id
         inner join .....
         where ......
         order
      ) pagination
    WHERE rownum <= 200 
  )
WHERE r__ > 100

此查询中的问题是,从表“table\u NAME”中获取数据的最内部查询返回了大量数据,导致整个查询需要8秒钟(应用where子句后返回了大约200万条记录,其中包含9或10个join子句)。

这是因为最内部的查询是获取与where子句相关的所有数据,然后第二个查询是获取200行,第三个查询是排除前100行,以获取所需的第二页数据

是否有一种方法可以在一个查询中实现这一点,即获取第二个页面所需的数据,而不必执行所有这些步骤并导致性能问题?

非常感谢。

共有1个答案

裴良弼
2023-03-14

这取决于您的排序选项(order by…):数据库需要对整个数据集进行排序,然后再应用outerwhere rownum

如果删除您的order by子句,它将只提取200行。在某些情况下,oracle可以避免排序操作(例如,如果oracle可以使用某些索引以所需的顺序获取请求的数据)。顺便说一句,Oracle在出现rownum时使用优化的排序操作

您可以使用排序跟踪事件更深入地研究排序操作:alter session set events“10032 trace name context forever,level 10”

此外,有时最好使用分析函数,例如

select *
from (
   select
      t1.*
     ,t2.*
     ,row_number()over([partition by ...] order by ...) rn
   from t1
       ,t2
   where ...
   )
where rn <=200
and rn>=100

因为在某些特定情况下,Oracle可以将您的查询转换为将排序和排序筛选器谓词推到最早的步骤。

 类似资料:
  • 我有一个简单的查询如下“select * from USERS”。我还使用Pageable来启用分页。 此查询可能具有基于给定参数是否为 null 的可选谓词。 例如,如果给定了“code”参数且该参数不为空,则查询变为“select * from USERS where code =:code”; 据我所知,我不能使用@Query注释来实现这一点。我可以实现一个定制的存储库,并使用EntityM

  • 本文向大家介绍Layui实现带查询条件的分页,包括了Layui实现带查询条件的分页的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Layui实现带查询条件的分页,供大家参考,具体内容如下 这个前端UI框架是真的让人又爱又恨呐!想了很久的方案才行的通 这是全部源码: 这个业务只有一个问题那就是button,我们需要把button的标签换了,换成a标签 还有一个点就是在点击查询后,获取的

  • 问题内容: 在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是在启动时遇到了问题。 根据spring-data文档中使用的示例50,可以指定查询本身和countQuery,如下所示: 出于好奇,在课堂上我可以看到它包含以下代码来检查其是否为有效的jpa查询: 我的查询中包含一个参数,所以是的,但它也在寻找或序列里

  • 在一个web项目中,使用最新的spring-data(1.10.2)和MySQL5.6数据库,我试图使用带分页的本机查询,但在启动时遇到的是。 根据示例50,在使用来自spring-data文档的@query时,可以指定查询本身和countQuery,如下所示: 出于好奇,在类中,我可以看到它包含以下代码,以检查它是否是有效的jpa查询: 我的查询包含一个参数,因此是,但它也在中查找一个或序列,我

  • 我使用以下“wapper”在少数情况下实现分页,并且通常将其称为“标准分页选择”。因此,要对任何select语句的结果进行分页,只需将select语句包装在“标准分页选择”中。 我的问题是关于分页位的行为和ROWNUM的魔力。据我了解,子查询并不是每次都选择完整的结果集,而是在寻找确认或其他方式? 下面是对上面显示的分页行为的正确描述,例如,如果页面大小为50: 要选择: 第1页(例如0-50)子

  • 使用数据库的应用程序,多数情况下都需要使用 “分页” 这个功能。尤其是在 Web 应用程序中,后端的分页查询尤其的普遍。 在以往的使用经验中,一个分页查询,除了能获取到一个列表外,我们通常需要如下几个信息才能在客户端显示出一个完整的翻页条。 当前页数 -- 第几页 页大小 -- 每页有多少条记录 总页数 -- 一共多少页 总记录数 -- 如果不分页,一共有多少条记录 当我们获得了这四条信息后,对于