ORACLE 的排序分页为什么这么奇葩 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
byeyo
V2EX    数据库

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

  •  
  •   byeyo 2023-08-30 10:06:19 +08:00 2058 次点击
    这是一个创建于 792 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对比 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  
       2023-08-30 10:10:37 +08:00
    在您的示例中,您展示了在 MySQL 和 Oracle 中执行类似的分页查询的不同方法。在 MySQL 中,您使用了常见的 OFFSET 和 LIMIT 子句来进行分页,而在 Oracle 中,您使用了子查询和 ROWNUM 来实现相同的效果。

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

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

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

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

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

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

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

    SELECT fieldA,fieldB
    FROM table
    ORDER BY fieldA
    OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
    Narcissu5
        3
    Narcissu5  
       2023-08-30 10:33:32 +08:00
    mysql 的分页不是 iso sql ,实际上 mysql 很多好用的特性都不标准,标准里面没有简单的分页的办法。这大概也是 mysql 很多方面稀烂还能流行起来的原因之一
    montaro2017
        4
    montaro2017  
       2023-08-30 10:40:01 +08:00   1
    @Livid @zhaoyta #1 AI 回复
    Tiller
        5
    Tiller  
       2023-08-30 11:15:29 +08:00
    2023 年了,MySQL 支持 merge into 和 full join 了嘛
    dzdh
        6
    dzdh  
       2023-08-30 11:26:27 +08:00
    @Tiller merge into 算是有了 full join 鸡肋
    yohole
        7
    yohole  
       2023-08-30 11:39:32 +08:00
    这是其中一个反例,其实 oracle 有些 SQL 的语法比 mysql 简单很多,当然都是过去几个旧版本的比较,最新的 mysql 版本接触不多,可能也基本实现了
    Tiller
        8
    Tiller  
       2023-08-30 11:39:57 +08:00
    @dzdh full join 不鸡肋,前东家的很多数据都是用了 full join ,还有很多聚合函数、行转列。MySQL 的语法太弱
    Livid
        9
    Livid  
    MOD
    PRO
       2023-08-31 14:12:59 +08:00
    @montaro2017 谢谢,那个使用 AI 回复的账号已经被彻底 ban 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2923 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:03 PVG 22:03 LAX 07:03 JFK 10:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86