用SQL写出分页查询
SELECT * FROM
(
SELECT A.*,分分页 ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A --不排序
WHERE ROWNUM <=
)
WHERE RN >= ;
SELECT
*FROM (SELECT a.*, row_number() over(ORDER BY 1) rn--假排序,速度同上
FROM t1 a)
WHERE rn BETWEEN AND ;
SELECT
*FROM (SELECT a.*,页源原理 row_number() over(ORDER BY c1) rn --真实排序,无法比较速度
FROM t1 a)
WHERE rn BETWEEN AND ;
Oracle的分分页分页查询语句基本上可以按照本文给出的格式来进行套用。
分页查询格式:
SELECT * FROM
(
SELECT A.*,页源原理 ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <=
)
WHERE RN >=
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 和RN >= 控制分页查询的分分页每页的范围。
上面给出的页源原理表白html源码这个分页查询语句,在大多数情况拥有较高的分分页效率。分页的页源原理目的就是控制输出结果集大小,将结果尽快的分分页返回。在上面的页源原理分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 这句上。分分页
选择第 到条记录存在两种方法,页源原理一种是分分页证券公式源码上面例子中展示的在查询的第二层通过ROWNUM <= 来控制最大值,在查询的页源原理最外层控制最小值。而另一种方式是分分页去掉查询第二层的WHERE ROWNUM <= 语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN AND
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的omni 6.0源码查询条件WHERE ROWNUM <= 就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN AND 是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。倒车游戏源码
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO 一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,特殊macd源码而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。
因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <=
)
WHERE RN >=
sql数据库分页
在SQL数据库中实现分页,首先需要明确几个关键步骤。首先,你需要确定每页显示的数据条数,这通常是自定义的。其次,需要获取当前选择的页码,这将决定从总数据中跳过多少条记录。有了这些信息,构建SQL查询就变得简单了。以下是一个示例SQL语句: SELECT top * FROM tableName WHERE (id not in (SELECT top * FROM tableName ORDER BY Id desc)) OR Id > (当前页码 - 1) * 每页显示数量 ORDER BY Id desc 这里的参数说明如下:- 每页显示的数量:根据需要设定,例如条。
- 总页数:总数据条数除以每页显示的条数。
- 当前页码的计算:从客户端获取的页码减1(如第3页传为3,计算为2),然后乘以每页显示的条数(例如),得到需要跳过的记录数(如)。
在SQL语句中,top 代表每页显示条数据,not in (SELECT top ...)这部分则是跳过前条,从而查询第到第条数据。理解了SQL的逻辑,分页操作就不再是难题了。
Mybatis:PageHelper分页插件源码及原理剖析
PageHelper是一款强大的Mybatis分页插件,以其开源和免费的特性受到赞誉。其功能复杂性远超初印象,实现了物理分页的强大与彻底。核心在于保持分页插件的基本功能,同时提供智能参数以适应复杂场景。
基本使用与配置方面,PageHelper依赖于jsqlparser包,Maven会自动引入。关键参数dialect = mysql,与oracle等其他数据库对应参数可根据需要选择使用或避免使用,保持分页插件的简洁性。
源码分析中,PageHelper包含SqlUtil、SqlUtilConfig等类,负责数据库类型专用SQL工具的管理与执行,如count查询、分页查询等。自动检测当前数据库方言的机制和缓存策略提高了插件的灵活性与效率。
PageSqlSource类展示了如何解析SQL并添加分页参数,确保分页查询的正确执行。Parser类则负责解析SQL并添加所需分页参数,实现分页功能的关键步骤。
执行分页查询的`SqlUtil.doProcessPage()`方法,展示了创建count查询、执行分页查询、修改参数列表等关键步骤,确保分页查询的高效执行。
PageHelper提供了两种使用方式:直接通过RowBounds参数进行分页查询和使用静态方法`PageHelper.startPage()`。其原理在于使用ThreadLocal传递和保存Page对象,每次查询时需单独设置,以保持分页功能的灵活性。
最佳使用建议包括明确指定方言以及编写SQL分页业务与对应的count查询,避免简化操作以提高性能。推荐进一步阅读相关聚合内容,如SpringBoot、设计模式、Mybatis、多线程等,以深入理解其应用与优化。
2024-11-30 17:27
2024-11-30 16:25
2024-11-30 16:21
2024-11-30 16:09
2024-11-30 15:54