
性能测试不再卡顿:Oracle分页查询优化秘籍,轻松应对大数据量场景!
01 Oracle数据库的分页操作对于Oracle数据库的分页查询语句一般采用如下的方式:
📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
01 Oracle数据库的分页操作
对于Oracle数据库的分页查询语句一般采用如下的方式:
02 Oracle数据库的分页操作的性能分析和调优
按照分页操作的SQL语句的复杂度,可以将分页操作的种类分为只包含排序操作的分页、包含过滤操作和排序操作的单表查询分页、包含过滤操作和排序操作的单分区表查询分页、包含过滤操作和排序操作的表关联查询分页等几种类型。
1、只包含排序操作的分页
一般地,分页操作的SQL语句带有排序操作,即:order by。例如:在客户访问记录表中查询最新访问的30个客户,这就需要按照客户的访问时间进行降序排序。
对于这类分页操作的调优,需要利用索引是有序的特性,为order by中的排序列设置索引。
如果是对多个列进行排序,需要为所有的排序列创建一个复合索引,创建时需要注意复合索引中的各列的顺序需要与order by中指定的各排序列的顺序一致,且还需注意索引是升序还是降序,以下示例1展示了该类SQL语句的调优。
【示例1】
对名为user的用户信息表执行分页查询,查询最近访问但积分最低的前10位用户,分页语句如下所示。
user表中的记录数为300万左右。
为排序列创建一个复合索引,usercore列在前,lasttime列在后,且将lasttime列的索引设置为降序,即:
创建索引后,该语句的真实执行计划中的核心内容如下图所示。
通过以上的执行计划可以知:
-
(1)该SQL语句执行时访问User表时采用了INDEX FULL SCAN(索引快速全扫)的访问方式(因为未指定过滤条件,所以只能采用INDEX FULL SCAN的访问方式);
-
(2)执行INDEX FULL SCAN时访问10条记录后,已经满足分页要求,扫描终止,该SQL语句执行完毕。即上图执行计划中的COUNT STOPKEY(COUNT STOPKEY一旦获取到满足分页条件所需的记录后即停止SQL语句的执行)操作;
-
(3)执行计划中没有诸如SORT ORDER BY、SORT ORDER BY ROWNUM之类的排序操作,说明以上SQL语句执行时利用了索引消除了排序操作。
综上所述可知,该SQL的执行计划是正确的,高效的。
此外,对于只有1个列的降序排序操作,也可以不将该列的索引设置为降序索引,而是创建一般的升序索引,在查询执行时使用index_desc提示器,使得执行对该索引的扫描时采用降序扫描的方式。
如果创建符合索引时,排序列的顺序与order by中的排序列顺序不一致,在查询执行时,排序列的索引将仅用于通过索引访问记录,之后对获取的结果集再执行一次额外的排序操作,执行计划中将出现SORT ORDER BY或SORT ORDER BY ROWNUM之类的排序操作提示,说明并未利用索引消除排序操作。
如果创建的索引的顺序与实际排序的顺序不一致,例如:降序排序,升序索引,执行时也未使用index_desc提示器,则在查询执行时,排序列的索引也将仅用于通过索引访问记录,之后也要对获取的结果集再执行一次额外的排序操作。
2. 包含过滤条件和排序操作的分页
对于包含过滤条件和排序的分页,除了为排序列创建索引外,还需要为过滤条件创建索引。根据过滤条件的不同,又分为等值过滤和非等值过滤。
Ⅰ.等值过滤
如果分页语句中包含等值过滤和排序,此时需要为等值过滤列和排序列创建复合索引,该复合索引的顺序为等值过滤列在前,排序列在后,即:
(等值过滤列1,等值过滤列2,...,排序列1,排序列2,...)
以下示例2展示了该类SQL语句的调优。
【示例2】
对名为user的用户信息表执行分页查询,查询最近访问但积分最低的前10位类别为C类用户,分页语句如下所示。
为等值过滤列,排序列创建一个复合索引,按userclass,userscore,lasttime的顺序创建,即:
创建索引后,该语句的真实执行计划中的核心内容如下图所示。
通过以上的执行计划可以知:
-
(1)该SQL语句执行时访问User表时采用了INDEX RANGE SCAN(索引范围扫描)的访问方式,因为已经指定了过滤条件,且为过滤条件列设置了索引。
-
(2)执行INDEX RANGE SCAN时访问10条记录后,已经满足分页要求,扫描终止,该SQL语句执行完毕。即上图执行计划中的COUNT STOPKEY操作;
-
(3)执行计划中没有诸如SORT ORDER BY、SORT ORDER BY ROWNUM之类的排序操作,说明以上SQL语句执行时利用了索引消除了排序操作。
综上所述可知,该SQL的执行计划是正确的,高效的。
需要注意的是,创建复合索引时等值过滤条件列要放在排序列之前,如果将其放在排序列之后,即:按userscore,lasttime,userclass,的顺序创建上述分页语句的真实执行计划将变为如下图所示的。
通过以上的执行计划可以发现,对user表的访问方式由INDEX RANGE SCAN变为INDEX FULL SCAN方式。
过滤执行时为执行计划中id为7中对应的access和filter两种方式的结合,该方式说明在使用userclass列上索引访问user表时在执行索引扫描的同时又执行了对记录的过滤操作。
具体操作为:扫描索引时,同时对每条索引按照过滤条件,如果符合过滤条件的记录达到分页操作指定的10条后,扫描停止。
这种边扫描边过滤的访问方式的执行效率较直接执行INDEX RANGE SCAN的访问方式稍低,因为这种方式的逻辑读多于INDEX RANGE SCAN方式。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
更多推荐
所有评论(0)