使用过order by rowid排序吗

本文探讨了一种使用ORDER BY ROWID进行排序的SQL用法,其目的是确保分页显示的稳定性。然而,这可能导致不必要的性能开销。通过分析,发现可以通过依赖索引来避免不稳定的排序,并在保持数据正确性的同时,提高了查询性能。实验显示,移除ORDER BY ROWID后,物理读取减少了7.7%,对于高流量系统,这样的优化效果显著。
摘要由CSDN通过智能技术生成

前天协助SA排错时,通过tbsql sql发现了使用oreder by rowid做排序的sql,我很好奇这种写法,为什么业务逻辑会通过rowid来排序来实现,常常这种疑惑浪费了我很多时间。
先确认两个问题:
1.为什么会使用rowid来排序
2.一个普通的分页sql,物理读排在第一,为什么每次需要消耗356个的物理读

Physical Reads  Executions  Reads per Exec %Total Time (s)  Time (s) Hash Value
--------------- ------------ -------------- ------ -------- --------- ----
 5,043,897       14,149          356.5    7.7   744.89  53095.33 2800676544
SQL> select/*+ordered use_nl(t1 t2)*/ *
  9    from (select rid, rownum as linenum
 10            from (select rowid as rid
 11                    from auc_table
 12                   where username = 'abc123456789'
 13                     and approve_status in (0, 1, -9)
 14                     and ends > SYSDATE
 15                   order by starts asc,rowid )
 16           where rownum <= 100) t1,
 17         auc_table t2
 18   where t1.linenum >= 1
 19     and t1.rid = t2.rowid;

引江枫的论断:

oracle9204版本有这个问题:因为不稳定的排序,同样值的记录的位置在排序后不是固定的。假设两条记录,1,a和 1,b,按1排序,那么在第一页的时候,可能最后一条是 1 ,a,翻到第二页,本来第一条应该是1,b的但是因为排序不稳定,可能第一条还是1,a,这样1,b就没有显示出来了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值