以下的例子如何优化呢?
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
接下来我们来看看其优化效果
首先我们创建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
这里提前获取前300行数据,然后再分页取得25行,300也就是TOP_ORDER_ESTIMATE_CARD的配置。
假设单表大表排序分页提前获取前几十行数据。通过增加排序列索引加上top_order_opt_flag=2即可达到优化效果。
文章
阅读量
获赞