最近幫忙公司的幾個項目組進行了不一樣方面的性能優化,發現幾個項目都出現了一些共性的問題。這裏寫一篇文章,總結一下這幾類問題,以及其對應的解決方案。方便其它項目組參考。css
常見問題一:打開頁面很是慢,有的項目打開一個頁面居然要 20 多秒。 html
優化步驟:前端
常見問題二:單條 SQL 語句執行較慢 算法
在數據量較大的狀況下,一些 SQL 語句執行得很是慢。數據庫
優化步驟:後端
例如,下面這個 SQL,在壓力測試 1000 萬行數據時,已經須要 8 秒左右:瀏覽器
SELECT * FROM ( SELECT T.*, ROWNUM RN FROM ( SELECT * FROM "T_PRIMITIVEDETAIL" "T0" WHERE "T0"."ORDERGOODSDATE" >= :p0 AND "T0"."ORDERGOODSDATE" <= :p1 AND "T0"."CORPORATION" = :p2 AND "T0"."DBI_ISPHANTOM" = :p3 ORDER BY "T0"."ID" ASC ) T WHERE ROWNUM <= 5000010 ) WHERE RN >= 5000000 --Parameters:2016/5/1 0:00:00,2016/5/31 23:59:59,"惠州酷友網絡科技有限公司","0"
ID 列和 ORDERGOODSDATE 列都是創建了索引的,同時也爲 ORDERGOODSDATE 列創建了表分區。通過幾回測試,發現經過索引列排序進行查詢速度仍是較慢(索引 Id 列:首次5秒,後面都是2.3秒;有索引的時間列:6秒;不排序:2秒)。緩存
同時,咱們還對分頁 SQL 進行的測試。目前有三種較爲通用的分頁格式:安全
1.根據ROWID來分
select * from t_xiaoxi where rowid in(
select rid from (
select rownum rn,rid from(
select rowid rid,cid from
t_xiaoxi order by cid desc
) where rownum<10000
) where rn>9980
)
order by cid desc;
2.按分析函數來分
select * from (
select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t
) where rk<10000 and rk>9980;
3.按ROWNUM來分
select * from(
select t.*,rownum rn from(
select * from t_xiaoxi order by cid desc
) t where rownum<10000
) where rn>9980;性能優化
結果發現,原來的分頁格式,效率是最高的。下面的 SQL 查詢須要 4 秒:
select * from (
select t.*,row_number() over(order by id ASC) rk from T_ENTERPRISETRANSACTION t
) where rk <= 5000010 and rk >= 5000000
因爲咱們的分頁 SQL 是自動生成的,因此格式方面咱們要保留必定的通用性,同時性能不能太差。因此仍是決定繼續保留原有的格式。
前面幾個優化方案沒有成功。咱們就看了一下測試人員插入的一千條數據。原來這些數據的時間都是同一天的!!!形成了分區和索引失效。將數據按照真實場景錄入後,不到 1s 就查詢出來了。
另外,第 6 條:有 50 萬頁數據的頁面,不該該設計給客戶看到。因此我讓項目組的同這考慮是否須要刪除這個頁面,換一種實現方案。
第8條,不查全字段,只查 ID:測試後,也有了比較明顯的效果。
SELECT ID FROM ( SELECT T.*, ROWNUM RN FROM ( SELECT ID FROM "T_ENTERPRISETRANSACTION" "T0" --order by T0.Id desc --order by T0.DBI_CreatedTime --order by T0.tradeDate ) T WHERE ROWNUM <= 5000010 ) WHERE RN >= 5000000 --0.6秒 SELECT * FROM "T_ENTERPRISETRANSACTION" "T0" WHERE ID IN (7853679,7853680,7853681,7853682,7853683,7853684,7853685,7853686,7853687,7853688,7853689) --0.1秒
一共只須要 0.7 秒。
常見問題三:大數據導入性能優化
公司產品的一個重要模塊是一個數據導入引擎。基於 WF4 引擎,配合必定的活動,來實現從文件到數據庫的導入。即:讀取文件 –> 大量數據格式轉換邏輯 & 大量業務邏輯 –> 導入數據庫。
因爲邏輯很是複雜,因此咱們並無把這些邏輯放到數據庫中去編寫存儲過程,而是基於內存中的領域實體來執行業務邏輯。
對於此程序的優化步驟:
小結
本文對公司幾個項目遇到的共性問題進行了總結。
但願能對其它的項目組有所幫助。也但願能收集到更多的優化建議。