使用倒序索引提升ORDER BY DESC性能
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)東坡,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
使用倒序索引(INDEX DESC),可以大幅提升帶有order by desc子句的SQL語(yǔ)句性能。
舉例
1、表名:test_t,有一字段名為object_id
2、總數(shù)據(jù)量:580000行,segment_size:72MB
3、Where條件(Owner=’SYS’ and Object_id50000)的行數(shù):32472行
4、SQL語(yǔ)句:select * from test_t where owner='SYS' and object_id 50000 order by object_id desc
5、希望借助倒序索引,提升order by object_id desc的性能
希望能幫到你。
1、通過(guò)rownum對(duì)數(shù)據(jù)庫(kù)的記錄進(jìn)行編號(hào)
SELECT?ROWNUM?RN1,A.*?FROM?A;//從表A中獲取記錄,并用rownum生成RN1
2、通過(guò)RN1的標(biāo)記進(jìn)行倒序排序
SELECT?B.*,ROWNUM?RN2?FROM?(SELECT?ROWNUM?RN1,A.*?FROM?A)?ORDER?BY?RN1?DESC;
3、通過(guò)RN2取小于等于10的數(shù)據(jù)記錄
SELECT?*?FROM?(SELECT?B.*,ROWNUM?RN2?FROM?(SELECT?ROWNUM?RN1,A.*?FROM?A)?ORDER?BY?RN1?DESC)?WHERE?RN2=10;
如果表非常大,需要用rownum查詢指定的幾條,下面命令可以實(shí)現(xiàn)
select * from(
select *
from T_NB_COPY t
order by create_time desc
) b where rownum = 5
去重及時(shí)間段獲取
select distinct t.device_id from T_RECEIVE_LOG t where ?t.receive_time = to_date('2018-02-28 00:00:00','yyyy-mm-dd hh24:mi:ss') and t.receive_time = to_date('2018-02-27 00:00:00','yyyy-mm-dd hh24:mi:ss')
oracle中前N條數(shù)據(jù)可用row_number來(lái)實(shí)現(xiàn)。
如表中數(shù)據(jù):
現(xiàn)在要求按照ID倒序,取出前十位:
oracle中執(zhí)行方法:
select?t.id,t.name?from
(select?test.*,row_number()?over?(order?by?id?desc)?rn?from?test)?t
where?rn=10;
結(jié)果:
計(jì)算和排序 可以用兩個(gè)表達(dá)式的;計(jì)算列作為 select 的子句; (endTime-nowTime) 作為 order by 的子句
如果提示 order by 不是查詢的內(nèi)容,可以用子查詢 ,先 select 出來(lái)兩個(gè)列,然后 在按照 (endTime-nowTime) 的倒敘排列