我如何改进SQL分页? [英] How I improve SQL paging?

查看:67
本文介绍了我如何改进SQL分页?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的分页速度很慢。我怎么改进它?谢谢

My paging is so slow. how I improve it? Thanks

SELECT 
T.* 
FROM (
SELECT 
QRY.* 
, ROWNUM RNUM 
FROM (
SELECT				 
A.PRPTY_NO               
, B.PRPTY_NM       
, B.CL_CD                
, B.ORG_PRPTY_REGNO      
, A.MODEL                
, B.PFMNC_MESURE_UNIT    
, B.PFMNC_CPCTY          
, A.MADE_NATION          
, A.MADE_YEAR            
, A.PRPOS_DAY
, B.USE_START_PNT_RECK            
, GET_DSPS_LEDG_QTY(B. PRPTY_NO, B.LEDG_QTY,  '20141231' /**P*/) AS LEDG_QTY                 
, B.REGSTR_AMOUNT                
, B.BVN_PC               
, GET_ACCUM_DEPRECIATION(A.PRPTY_NO,  '20141231' /**P*/,B.BVN_PC,B.DPRC_YEAR, B.USE_START_PNT_RECK, B.DPRC_BSIS_AMT, B.DPRC_DAY, B.SRVIVE_VALU, B.DPRC_ACMTLAMOUNT, B.DPRC_MTHD) AS  DPRC_ACMTLAMOUNT     
, B.SRVIVE_VALU
, B.BVN_PC - GET_ACCUM_DEPRECIATION(A.PRPTY_NO,  '20141231' /**P*/,B.BVN_PC,B.DPRC_YEAR, B.USE_START_PNT_RECK, B.DPRC_BSIS_AMT, B.DPRC_DAY, B.SRVIVE_VALU, B.DPRC_ACMTLAMOUNT, B.DPRC_MTHD) AS SRVIVE_AMT   
, C.ADDR_LCLAS_NM AS AIMAG_NM 
, C.ADDR_MLSFC_NM AS SOM_NM              
, C.ORG_NM AS ORG_NM               
, C.ORG_REG_NO AS REG_NO               
, C.SPC_POS_CD AS OWNER_NO
, B.ADD_FILE_ID	
FROM TB_EQPMN_REGSTR A
LEFT JOIN TB_BASS_REGSTR B
ON A.PRPTY_NO = B.PRPTY_NO
LEFT JOIN TB_ORG C
ON B.MNGTORG_ID = C.ORG_ID		
WHERE 1=1	
AND C.UPPER_ORG_ID IN (SELECT ORG_ID FROM TB_USER_MNGTORG WHERE USER_ID =  'MBIC_ADMIN' /**P*/)
AND B.PROVREG_YN =  'N' /**P*/			
AND (( '20141231' /**P*/ >= TO_CHAR(B.REG_DTM, 'YYYYMMDD') AND  '20141231' /**P*/ >= TO_CHAR(B.UPD_DTM, 'YYYYMMDD') AND B.DEL_YN = 'N')
OR ( '20141231' /**P*/ >= TO_CHAR(B.REG_DTM, 'YYYYMMDD') AND TO_CHAR(B.UPD_DTM, 'YYYYMMDD') >  '20141231' /**P*/))				  
ORDER BY B.REG_DTM DESC
)QRY
)T
WHERE T.RNUM  BETWEEN ( 0 /**P*/+1) AND ( 0 /**P*/+ 10 /**P*/)





我尝试了什么:



我改变了如上



What I have tried:

I changed like on

AND ROWNUM BETWEEN ( 10 /**P*/+1) AND ( 10 /**P*/+ 10 /**P*/)
ORDER BY B.REG_DTM DESC



但在第二页时没有工作


but not working when second page

AND ROWNUM BETWEEN ( 10 /**P*/+1) AND ( 10 /**P*/+ 10 /**P*/)
ORDER BY B.REG_DTM DESC

推荐答案

有一件事是确保您有足够的索引。例如,检查是否存在以下索引。

- B_EQPMN_REGSTR:PRPTY_NO

- TB_BASS_REGSTR:PRPTY_NO,MNGTORG_ID,PROVREG_YN,REG_DTM

- TB_ORG: ORG_ID,UPPER_ORG_ID

- TB_USER_MNGTORG:USER_ID



有点奇怪的是,您的订购是针对外部连接的表列完成的。所以你可能在列表中有NULL值,但我知道你知道这个。



减速的一件事是日期之间的比较。为什么要将日期更改为字符?而是使用条件的日期变量,并将日期值设为日期。



如果您使用的是Oracle 12我建议使用限制条款,请查看在 ORACLE-BASE - 前N个查询中的行限制条款Oracle Database 12c第1版(12.1) [ ^ ]
One thing would be to ensure that you have sufficient indexing in place. For example check the existence of following indexes.
- B_EQPMN_REGSTR: PRPTY_NO
- TB_BASS_REGSTR: PRPTY_NO, MNGTORG_ID, PROVREG_YN, REG_DTM
- TB_ORG: ORG_ID, UPPER_ORG_ID
- TB_USER_MNGTORG: USER_ID

What seems a bit odd is that your ordering is done for a table column which is outer joined. So you may have NULL values in the list, but I take it you're aware of this.

One thing that slows down is the comparison between dates. Why do you change the dates to characters? Instead use a date variable for the condition and let the date values be dates.

If you're using Oracle 12 I'd suggest using limiting clause, have a look at ORACLE-BASE - Row Limiting Clause for Top-N Queries in Oracle Database 12c Release 1 (12.1)[^]


这篇关于我如何改进SQL分页?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆