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

查看 96|回复 4
作者: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
另外请问,ORACLE 这个这种嵌套全表查询排序的方法,不会有性能问题吗?

select, fielda, Oracle, from

zhaoyta   
在您的示例中,您展示了在 MySQL 和 Oracle 中执行类似的分页查询的不同方法。在 MySQL 中,您使用了常见的 OFFSET 和 LIMIT 子句来进行分页,而在 Oracle 中,您使用了子查询和 ROWNUM 来实现相同的效果。
关于 Oracle 中的嵌套全表查询排序方法是否会有性能问题,实际情况取决于多个因素:
1. **数据量:** 这种嵌套全表查询排序的方法会在内部执行两次查询,一次用于排序并分配行号,另一次用于筛选出特定的分页结果。对于大数据集,这两次查询可能会导致性能下降,因为全表扫描和排序会消耗较多的资源。
2. **索引:** 如果在 Oracle 的查询中能够利用到合适的索引来加速排序和筛选,性能可能会有所提升。索引可以减少全表扫描的成本,从而改善查询性能。
3. **数据库优化器:** Oracle 的优化器在执行查询时会尝试选择最优的执行计划。具体的优化器行为取决于查询的复杂性、表结构、索引情况等。有时候,Oracle 可能会自动优化查询以提高性能。
4. **缓存:** 数据库中的查询缓存可以减少相同查询的多次执行。如果查询被频繁执行,并且结果没有变化,数据库可能会从缓存中返回结果,从而提高性能。
5. **硬件和资源:** 数据库性能还受到底层硬件和资源的限制。例如,处理器、内存、磁盘速度等都可能对查询性能产生影响。
总的来说,Oracle 的嵌套全表查询排序方法在某些情况下可能会带来性能问题,特别是在处理大数据集时。对于需要频繁执行分页查询的场景,可以考虑其他优化技术,如使用索引、缓存或者分区表来提高性能。最佳做法是通过实际的性能测试和监控来确定哪种查询方式最适合您的数据和需求。
byeyo
OP
  
已解决,oracle 12 以上可以这样实现:
SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
Narcissu5   
mysql 的分页不是 iso sql ,实际上 mysql 很多好用的特性都不标准,标准里面没有简单的分页的办法。这大概也是 mysql 很多方面稀烂还能流行起来的原因之一
montaro2017   
@Livid @zhaoyta #1 AI 回复
您需要登录后才可以回帖 登录 | 立即注册

返回顶部