由于開發經驗較少,數據量較大(千萬級,日有40萬條數據左右),導致這個分頁jsp頁面做的效率非常低,通過一系列的優化后,效果明顯得到了提高,記錄一下筆記:
1、分頁獲取的list對象集合由于沒有預料到數據量的大小,是直接一次性讀取然后展示到前臺的,導致查詢展示效率非常低:
更改SQL語句,改為按照當前需要展示的數據行數,通過SQL的ROWNUM來進行控制查詢的數據量大小,(插入數據時,打開一個數據庫連接即一次性插入100條數據(可以配置的模式)):
SELECT BRAS_ADDRESS, APPLYTIMES, ALLFAILTIMES,SUCCESSRATE, RN
FROM
(SELECT BRAS_ADDRESS, APPLYTIMES, ALLFAILTIMES,SUCCESSRATE, ROWNUM AS RN
FROM
(SELECT BRAS_ADDRESS, APPLYTIMES, ALLFAILTIMES,1-ALLFAILTIMES/DECODE(APPLYTIMES,0,1,APPLYTIMES) AS SUCCESSRATE
FROM
(SELECT BRAS_ADDRESS,
SUM(DECODE(AUTNCOUNTTYPE,'REQ_CHALLENGE',APPLYTIMES,0)) AS APPLYTIMES,
SUM(DECODE(AUTNCOUNTTYPE,'ACK_CHALLENGE',APPLYTIMES,'ACK_AUTH',APPLYTIMES,'REQ_LOGOUT',APPLYTIMES,0)) AS ALLFAILTIMES
FROM T_BRAS_XXXX
WHERE READTIME between TO_DATE('2012-06-01 00:00:00','yyyy-MM-dd HH24:mi:ss')
and TO_DATE('2012-06-12 23:59:59','yyyy-MM-dd HH24:mi:ss')
GROUP BY BRAS_ADDRESS
)
ORDER BY SUCCESSRATE
)
WHERE ROWNUM <= 180
)
WHERE RN > 165 2、建立索引,建立索引的字段不能使用函數避免索引失效;
3、建立分區表,將間隔5天的數據放在一個表中:


----------------------刪除原表,新建分區表
--刪除表
drop table T_BRAS_XXXX;
commit;

--創建分區表:利用Oracle11g INTERVAL進行分區的方法
create table T_BRAS_XXXX
(
BRAS_XXXX_ID integer NOT NULL PRIMARY KEY,
BRAS_XXXX VARCHAR2(64),
AUTNCOUNTTYPE VARCHAR2(50),
SUCCESSTIMES NUMBER,
APPLYTIMES NUMBER,
INTERVALTIME NUMBER,
UPDATETIME DATE DEFAULT SYSDATE,
READTIME DATE
)
PARTITION BY RANGE (READTIME)
INTERVAL (NUMTODSINTERVAL(5,'day'))
(
PARTITION T_BRAS_XXXX_PART01 VALUES LESS THAN (TO_DATE('2012-07-01 00:00:00','yyyy-MM-dd HH24:mi:ss'))
)
--保留原來創建的BRAS_XXXX_ID自增序列
--創建索引
create index idx_t_bras_XXXX on t_bras_XXXX(readtime,bras_address);
commit;

--查看分區是否成功:
select table_name,partition_name from user_tab_partitions where table_name='T_BRAS_XXXX';