實例講解.NET應用訪問數據庫的開銷問題
本文將從一個實例講述.NET應用訪問數據庫的開銷問題。作者主要是從.NET應用訪問數據庫的遍歷順序改進講起。當然,與之配套的也就是我們熟悉的SQL Server數據庫。
拿今天的一個例子說話吧,那就表中存放的是全國的地域信息,表結構如下:
首先用代碼生成器和存儲過程生成器生成基本表的操作,推薦兩個工具:動軟.Net代碼生成器- 全功能的三層架構.Net代碼生成器和codeplex上面的一個存儲過程生成工具Stored Procedure Generator (for SQL Server 2000/2005 ... 。
現在提供了一個方法,可以獲取***和二級地域的信息,最開始的做法是先獲取***的地域信息,然后循環***地域信息,獲取它的子節點。
- List<KB.DSN.Entity.District> topDistrictList = new List<KB.DSN.Entity.District>();
- KB.DSN.BusinessAccess.District dictrictBll = new KB.DSN.BusinessAccess.District();
- topDistrictList = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", 0, Settings.District_Order_By));
- foreach (KB.DSN.Entity.District dis in topDistrictList)
- {
- dis.ChildrenDis = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", dis.DisCode, Settings.District_Order_By));
- }
- return topDistrictList;
上面的做法,可以實現功能,***測試獲取一級和二級的地域信息,花費時間5秒左右,不說能接受吧,起碼可以忍受。HttpWatch: An HTTP Viewer and HTTP Sniffer for IE and Firefox 這個工具可以查看瀏覽器獲取數據的時間。
后面又寫了一個方法,可以根據地域編號和想要獲取的層級數目,獲取指定地域下面的N層地域。和上面差不多,完成后一次是,一次獲取上海下面的二級花費10秒,獲取三級50秒。這好像就不能忍受了吧。
然后進行優化,代碼如下,變成一次獲取二級的數據,然后用C#代碼來生成層級關系。
- List<KB.DSN.Entity.District> districtList = new List<KB.DSN.Entity.District>();
- KB.DSN.BusinessAccess.District dictrictBll = new KB.DSN.BusinessAccess.District();
- districtList = dictrictBll.GetEntityList(string.Format(" {0} {1}", Settings.Get_Top_And_Second_District_Where,
- Settings.District_Order_By));
- var top = from c in districtList
- where c.DisFatherCode.Trim() == "0"
- select c;
- var second = from c in districtList
- where c.DisFatherCode.Trim() != "0"
- select c;
- foreach (KB.DSN.Entity.District dis in top)
- {
- var se = from c in second
- where c.DisFatherCode == dis.DisCode
- select c;
- dis.ChildrenDis = se as List<KB.DSN.Entity.District>;
- }
- return top as List<KB.DSN.Entity.District>;
作者后續
提到數據庫的訪問,尤其是遞歸層級調用問題,應該減少往返數據庫的次數,而是從數據庫將所需數據一次性獲取出來,然后在C#代碼中處理成樹形層級關系,這樣會提升很大的效率。
其實遞歸這種東西,用在數值計算中還可以,如果是復雜處理就***不用了,很消耗CPU和內存的,因為要使用棧存放很多內容。只是代碼看起來好理解,量大、操作復雜還是轉成非遞歸的好。
如果層級不多,變化不大,可以考慮使用緩存,效率就會更高。具體緩存的應用可以參看李天平的:系統緩存全解析 ,后面我可能也會寫一兩篇這方面的文章。
上一篇我們討論的數據是全國的行政地域信息,它有固定的格式。每個行政區劃的編碼長度都是12位,總共分5級來管理,前兩位代表31個?。ㄖ陛犑校髢晌淮硪话愕氖校ㄖ荩?,往后兩位代表市中的區(縣),往后三位是街道辦事處,***三位是居民委員會(社區)。
系統中其實有很多類似的類型編碼都被 放在數據庫中,有的是一級的,有的是分層級關系的。就像上面的地域信息,全國的5級總共有8萬左右條數據。***的辦法是一次將他們讀取到服務器的內存中,形成樹形層級,放在緩存中,如果有需要就直接獲取返回給客戶端,這樣可以較少很多的數據庫消耗。當然,前提是這類信息的變動很小,幾乎沒有變化。系統緩存全解析6:數據庫緩存依賴 中介紹了,可以使用數據庫依賴緩存,這樣就不怕數據庫內容有變化了,如果有變化,會自動更新緩存。緩存的正確使用,可以極大的提供效率
原文標題:NET應用訪問數據庫之數據庫的開銷問題
鏈接:http://www.cnblogs.com/virusswb/archive/2010/03/05/1679383.html
【編輯推薦】
- 淺談如何在SQL Server中生成腳本
- SQL Server使用索引實現數據訪問優化
- SQL Server 05數據庫被置為“可疑”的解決方法
- 詳解SQL Server的版本區別及選擇
- SQL Server不存在或拒絕訪問故障的排除