V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
byeyo
V2EX  ›  数据库

ORACLE 的排序分页为什么这么奇葩

  •  
  •   byeyo · 241 天前 · 1457 次点击
    这是一个创建于 241 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对比 mysql 简直是原始人。

    mysql:

    SELECT fieldA,fieldB FROM table ORDER BY fieldA OFFSET 5 LIMIT 14

    oracle:

    SELECT * FROM ( SELECT rownum rnum, a.* FROM( SELECT fieldA,fieldB FROM table ORDER BY fieldA ) a WHERE rownum <=5+14 ) WHERE rnum >=5

    另外请问,ORACLE 这个这种嵌套全表查询排序的方法,不会有性能问题吗?

    9 条回复    2023-08-31 14:12:59 +08:00
    zhaoyta
        1
    zhaoyta  
       241 天前
    在您的示例中,您展示了在 MySQL 和 Oracle 中执行类似的分页查询的不同方法。在 MySQL 中,您使用了常见的 OFFSET 和 LIMIT 子句来进行分页,而在 Oracle 中,您使用了子查询和 ROWNUM 来实现相同的效果。

    关于 Oracle 中的嵌套全表查询排序方法是否会有性能问题,实际情况取决于多个因素:

    1. **数据量:** 这种嵌套全表查询排序的方法会在内部执行两次查询,一次用于排序并分配行号,另一次用于筛选出特定的分页结果。对于大数据集,这两次查询可能会导致性能下降,因为全表扫描和排序会消耗较多的资源。

    2. **索引:** 如果在 Oracle 的查询中能够利用到合适的索引来加速排序和筛选,性能可能会有所提升。索引可以减少全表扫描的成本,从而改善查询性能。

    3. **数据库优化器:** Oracle 的优化器在执行查询时会尝试选择最优的执行计划。具体的优化器行为取决于查询的复杂性、表结构、索引情况等。有时候,Oracle 可能会自动优化查询以提高性能。

    4. **缓存:** 数据库中的查询缓存可以减少相同查询的多次执行。如果查询被频繁执行,并且结果没有变化,数据库可能会从缓存中返回结果,从而提高性能。

    5. **硬件和资源:** 数据库性能还受到底层硬件和资源的限制。例如,处理器、内存、磁盘速度等都可能对查询性能产生影响。

    总的来说,Oracle 的嵌套全表查询排序方法在某些情况下可能会带来性能问题,特别是在处理大数据集时。对于需要频繁执行分页查询的场景,可以考虑其他优化技术,如使用索引、缓存或者分区表来提高性能。最佳做法是通过实际的性能测试和监控来确定哪种查询方式最适合您的数据和需求。
    byeyo
        2
    byeyo  
    OP
       241 天前
    已解决,oracle 12 以上可以这样实现:

    SELECT fieldA,fieldB
    FROM table
    ORDER BY fieldA
    OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
    Narcissu5
        3
    Narcissu5  
       241 天前
    mysql 的分页不是 iso sql ,实际上 mysql 很多好用的特性都不标准,标准里面没有简单的分页的办法。这大概也是 mysql 很多方面稀烂还能流行起来的原因之一
    montaro2017
        4
    montaro2017  
       241 天前   ❤️ 1
    @Livid @zhaoyta #1 AI 回复
    Tiller
        5
    Tiller  
       241 天前
    2023 年了,MySQL 支持 merge into 和 full join 了嘛
    dzdh
        6
    dzdh  
       241 天前
    @Tiller merge into 算是有了 full join 鸡肋
    yohole
        7
    yohole  
       241 天前
    这是其中一个反例,其实 oracle 有些 SQL 的语法比 mysql 简单很多,当然都是过去几个旧版本的比较,最新的 mysql 版本接触不多,可能也基本实现了
    Tiller
        8
    Tiller  
       241 天前
    @dzdh full join 不鸡肋,前东家的很多数据都是用了 full join ,还有很多聚合函数、行转列。MySQL 的语法太弱
    Livid
        9
    Livid  
    MOD
       240 天前
    @montaro2017 谢谢,那个使用 AI 回复的账号已经被彻底 ban 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1159 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 18:00 · PVG 02:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.