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

254 天前
 byeyo

对比 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 这个这种嵌套全表查询排序的方法,不会有性能问题吗?

1476 次点击
所在节点    数据库
9 条回复
zhaoyta
254 天前
在您的示例中,您展示了在 MySQL 和 Oracle 中执行类似的分页查询的不同方法。在 MySQL 中,您使用了常见的 OFFSET 和 LIMIT 子句来进行分页,而在 Oracle 中,您使用了子查询和 ROWNUM 来实现相同的效果。

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

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

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

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

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

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

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

SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
Narcissu5
254 天前
mysql 的分页不是 iso sql ,实际上 mysql 很多好用的特性都不标准,标准里面没有简单的分页的办法。这大概也是 mysql 很多方面稀烂还能流行起来的原因之一
montaro2017
254 天前
@Livid @zhaoyta #1 AI 回复
Tiller
254 天前
2023 年了,MySQL 支持 merge into 和 full join 了嘛
dzdh
254 天前
@Tiller merge into 算是有了 full join 鸡肋
yohole
254 天前
这是其中一个反例,其实 oracle 有些 SQL 的语法比 mysql 简单很多,当然都是过去几个旧版本的比较,最新的 mysql 版本接触不多,可能也基本实现了
Tiller
254 天前
@dzdh full join 不鸡肋,前东家的很多数据都是用了 full join ,还有很多聚合函数、行转列。MySQL 的语法太弱
Livid
253 天前
@montaro2017 谢谢,那个使用 AI 回复的账号已经被彻底 ban 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/969387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX