最近一段時間在做一個統計頁面的最佳化工作,項目接近尾聲,所以把其中的一些最佳化的心得與大家分享。首先介紹一下這個項目的環境,由於這是一個老項目,而且開發人員基本上都不在了,採用的是ASP+ORACLE,OH MY GOLD!頁面主要的功能是對信件的各種狀態進行統計(一共有13個狀態),在沒有最佳化之前,頁面的訪問速度那叫一個慢啊,基本上統計一個月的信件數量需要5分鐘的時間或者更長,所以最佳化效能就成為了必然。我們將分步驟的對功能進行最佳化。
- 我們將在oracle資料庫中為要做查詢語句中的欄位建立索引,這一步應該自然而然就會想到的,因為建立索引可以大大提高系統的效能。友情提醒:千萬不要盲目的建立索引,有時候會得不償失。
- 在sql語句中加入oracle hints,之所以用到了這個是因為使用到了一個工具LECCO SQL Expert Pro for Oracle(),這個工具將為我們對SQL語句不同的組合進行篩選(在SQL RUN Time中會羅列出系統給出方案的消耗時間),並且將oracle hints直接運用到其中,使用者可以選擇時間消耗最少的SQL語句。工具使用起來非常容易,也為我們的最佳化工作節省的不少時間。(工具的為:http://files.cnblogs.com/wangqi/LeccoSQLExpertForOracle_1.rar,http://files.cnblogs.com/wangqi/LeccoSQLExpertForOracle_1.rar)
- 當我們對SQL語句最佳化完了之後,就是要開始對頁面進行處理了,由於頁面中使用了大量的嵌套迴圈,所以我們的原則是減少迴圈的次數,因為嵌套的迴圈越多,效率越低。能用SQL函數的盡量在SQL語句中完成,不要拋到頁面中執行。由於頁面代碼並交淩亂,所以我們還要對頁面代碼進行整理,雖然不一定起到什麼作用,但是整理後的代碼看起來會比較清爽。
- 通過上面的步驟,我們完成了最佳化的大部分工作,但是結果並沒有像我們想象中的一樣,頁面還是訪問的很慢。這讓我們很鬱悶,直到我們使用的複合式索引後,情況變得大大改觀,我們之前只是單一的為每個欄位建立索引,但是這次我們要將這些索引按一定的順序組合起來(),這裡我要強調的是索引的順序必須從後往前的也就是說是按SQL語句中從最後一個條件往前推。(當條件只有一個的情況下,oracle也會根據自己的最佳化策略適當的選用我們建立的這個複合式索引)
通過使用複合式索引,我們訪問的頁面的速度大大提高,現在不管是一個季度還是一整年的信件統計,基本上都只需要1秒鐘的時間。呵呵~~~