注册
分页查询提前获取数据
专栏/小周历险记/ 文章详情 /

分页查询提前获取数据

啊小周 2025/07/27 269 0 0
摘要 -单个单表分页排序查询如何优化?

1、问题

以下的例子如何优化呢?

SELECT * 
  FROM(SELECT INNER_TABLE.*, 
               ROWNUM OUTER_TABLE_ROWNUM 
          FROM (SELECT t1.* 
                   FROM ( SELECT * FROM  T1  
                           ) t1  
                  WHERE 1 = 1 
               ORDER BY T1.TTIME DESC)INNER_TABLE ) OUTER_TABLE 
 WHERE OUTER_TABLE_ROWNUM<=25AND OUTER_TABLE_ROWNUM >0

这个语句是单表全表查询排序后分页获取数据,似乎看起来没什么优化空间。分页获取前25行数据,相当于从按ttime排序后,从这批有序的数据中获取前25行数据,这里我们可以想到索引是有序的,而要提前获取数据,在达梦数据库里需要用到以下两个参数TOP_ORDER_OPT_FLAG/TOP_ORDER_ESTIMATE_CARD

2、参数介绍

image.png
接下来我们来看看其优化效果
首先我们创建order by中列的索引
CREATE OR REPLACE INDEX "IDX_DM_T1" ON "T1"("TTIME" DESC)global;
然后我们使用hint看看其效果

SELECT /*+TOP_ORDER_OPT_FLAG(2)*/* 
  FROM(SELECT INNER_TABLE.*, 
               ROWNUM OUTER_TABLE_ROWNUM 
          FROM (SELECT t1.* 
                   FROM ( SELECT * FROM  T1  
                           ) t1  
                  WHERE 1 = 1 
               ORDER BY T1.TTIME DESC)INNER_TABLE ) OUTER_TABLE 
 WHERE OUTER_TABLE_ROWNUM<=25AND OUTER_TABLE_ROWNUM >0

image.png
这里提前获取前300行数据,然后再分页取得25行,300也就是TOP_ORDER_ESTIMATE_CARD的配置。

3、小结

假设单表大表排序分页提前获取前几十行数据。通过增加排序列索引加上top_order_opt_flag=2即可达到优化效果。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服