2007年4月30日 星期一

Sql分頁效能

最近使用ASP+MSSQL執行一個專案

資料量大約數十萬筆,再進行例清單作分頁時

主機的負載常常百分之百(同時使用人數約四五十人存取)

查了一下發現是ADO中的PageCountRecordCount 二個屬性非常消耗系統資源

使用COUNT作第二次查詢取出資料量還比使用 RecordCount 來的快速

真是怪怪.......人性化的結果就是要多付出系統資源

作分頁的問題已經解決了,至少Loading不會再那麼高,降低好幾個百分比

再追蹤下去

由於MSSQL回傳資料只要符合條件的資料,全部都會一口氣回傳

然後再經由ADO的 AbsolutePage 屬性來負責欲顯示那一頁

問題就出在這,雖然在頁面上只出現二十筆資料

可是MSSQL可是回傳所有符合條件的資料

這才是伺服器Loading過重的元兇.....

因為MSSQL不像MySQL可以Limit 回傳的資料筆數

因此若查詢中有使用自訂 Function

是每一筆回傳的資料都會經過自訂 Function 的處理

而非是 AbsolutePage 指標在那一頁就只處理那一頁的資料(這個問題困擾了一整天..Orz)

問題找出來了

接下來就是要解決問題的時候

最佳的解決方式就是模擬MySQL limit的作法

限制回傳資料的筆數

要怎實作?

方法很多,可以作多次查詢或者寫一個預存程序解決

我選擇使用預存解決

伺服器Loaading從原本的90%以上降至30%左右(平均值)

【下列文章您可能也有興趣】

沒有留言: