自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)例講解.NET應(yīng)用訪問數(shù)據(jù)庫(kù)的開銷問題

數(shù)據(jù)庫(kù) SQL Server
本文將講述的是.NET應(yīng)用訪問數(shù)據(jù)的開銷問題,基于的數(shù)據(jù)庫(kù)自然也是微軟的SQL Server系列。

本文將從一個(gè)實(shí)例講述.NET應(yīng)用訪問數(shù)據(jù)庫(kù)的開銷問題。作者主要是從.NET應(yīng)用訪問數(shù)據(jù)庫(kù)的遍歷順序改進(jìn)講起。當(dāng)然,與之配套的也就是我們熟悉的SQL Server數(shù)據(jù)庫(kù)。

拿今天的一個(gè)例子說話吧,那就表中存放的是全國(guó)的地域信息,表結(jié)構(gòu)如下:

SQL Sever 2005表結(jié)構(gòu)

 首先用代碼生成器和存儲(chǔ)過程生成器生成基本表的操作,推薦兩個(gè)工具:動(dòng)軟.Net代碼生成器- 全功能的三層架構(gòu).Net代碼生成器和codeplex上面的一個(gè)存儲(chǔ)過程生成工具Stored Procedure Generator (for SQL Server 2000/2005 ... 。

現(xiàn)在提供了一個(gè)方法,可以獲取***和二級(jí)地域的信息,最開始的做法是先獲取***的地域信息,然后循環(huán)***地域信息,獲取它的子節(jié)點(diǎn)。

  1. List<KB.DSN.Entity.District> topDistrictList = new List<KB.DSN.Entity.District>();  
  2.             KB.DSN.BusinessAccess.District dictrictBll = new KB.DSN.BusinessAccess.District();  
  3.             topDistrictList = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", 0, Settings.District_Order_By));  
  4.  
  5.             foreach (KB.DSN.Entity.District dis in topDistrictList)  
  6.             {  
  7.                 dis.ChildrenDis = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", dis.DisCode, Settings.District_Order_By));  
  8.  
  9.             }  
  10.             return topDistrictList; 

上面的做法,可以實(shí)現(xiàn)功能,***測(cè)試獲取一級(jí)和二級(jí)的地域信息,花費(fèi)時(shí)間5秒左右,不說能接受吧,起碼可以忍受。HttpWatch: An HTTP Viewer and HTTP Sniffer for IE and Firefox 這個(gè)工具可以查看瀏覽器獲取數(shù)據(jù)的時(shí)間。

后面又寫了一個(gè)方法,可以根據(jù)地域編號(hào)和想要獲取的層級(jí)數(shù)目,獲取指定地域下面的N層地域。和上面差不多,完成后一次是,一次獲取上海下面的二級(jí)花費(fèi)10秒,獲取三級(jí)50秒。這好像就不能忍受了吧。

然后進(jìn)行優(yōu)化,代碼如下,變成一次獲取二級(jí)的數(shù)據(jù),然后用C#代碼來(lái)生成層級(jí)關(guān)系。

  1. List<KB.DSN.Entity.District> districtList = new List<KB.DSN.Entity.District>();  
  2.             KB.DSN.BusinessAccess.District dictrictBll = new KB.DSN.BusinessAccess.District();  
  3.             districtList = dictrictBll.GetEntityList(string.Format(" {0} {1}", Settings.Get_Top_And_Second_District_Where,  
  4.                 Settings.District_Order_By));  
  5.             var top = from c in districtList  
  6.                       where c.DisFatherCode.Trim() == "0"  
  7.                       select c;  
  8.             var second = from c in districtList  
  9.                          where c.DisFatherCode.Trim() != "0"  
  10.                          select c;  
  11.  
  12.             foreach (KB.DSN.Entity.District dis in top)  
  13.             {  
  14.                 var se = from c in second  
  15.                          where c.DisFatherCode == dis.DisCode  
  16.                          select c;  
  17.                 dis.ChildrenDis = se as List<KB.DSN.Entity.District>;  
  18.             }  
  19.             return top as List<KB.DSN.Entity.District>

作者后續(xù)

提到數(shù)據(jù)庫(kù)的訪問,尤其是遞歸層級(jí)調(diào)用問題,應(yīng)該減少往返數(shù)據(jù)庫(kù)的次數(shù),而是從數(shù)據(jù)庫(kù)將所需數(shù)據(jù)一次性獲取出來(lái),然后在C#代碼中處理成樹形層級(jí)關(guān)系,這樣會(huì)提升很大的效率。

其實(shí)遞歸這種東西,用在數(shù)值計(jì)算中還可以,如果是復(fù)雜處理就***不用了,很消耗CPU和內(nèi)存的,因?yàn)橐褂脳4娣藕芏鄡?nèi)容。只是代碼看起來(lái)好理解,量大、操作復(fù)雜還是轉(zhuǎn)成非遞歸的好。

如果層級(jí)不多,變化不大,可以考慮使用緩存,效率就會(huì)更高。具體緩存的應(yīng)用可以參看李天平的:系統(tǒng)緩存全解析 ,后面我可能也會(huì)寫一兩篇這方面的文章。

上一篇我們討論的數(shù)據(jù)是全國(guó)的行政地域信息,它有固定的格式。每個(gè)行政區(qū)劃的編碼長(zhǎng)度都是12位,總共分5級(jí)來(lái)管理,前兩位代表31個(gè)?。ㄖ陛犑校?,往后兩位代表一般的市(州),往后兩位代表市中的區(qū)(縣),往后三位是街道辦事處,***三位是居民委員會(huì)(社區(qū))。

系統(tǒng)中其實(shí)有很多類似的類型編碼都被 放在數(shù)據(jù)庫(kù)中,有的是一級(jí)的,有的是分層級(jí)關(guān)系的。就像上面的地域信息,全國(guó)的5級(jí)總共有8萬(wàn)左右條數(shù)據(jù)。***的辦法是一次將他們讀取到服務(wù)器的內(nèi)存中,形成樹形層級(jí),放在緩存中,如果有需要就直接獲取返回給客戶端,這樣可以較少很多的數(shù)據(jù)庫(kù)消耗。當(dāng)然,前提是這類信息的變動(dòng)很小,幾乎沒有變化。系統(tǒng)緩存全解析6:數(shù)據(jù)庫(kù)緩存依賴 中介紹了,可以使用數(shù)據(jù)庫(kù)依賴緩存,這樣就不怕數(shù)據(jù)庫(kù)內(nèi)容有變化了,如果有變化,會(huì)自動(dòng)更新緩存。緩存的正確使用,可以極大的提供效率

原文標(biāo)題:NET應(yīng)用訪問數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)庫(kù)的開銷問題

鏈接:http://www.cnblogs.com/virusswb/archive/2010/03/05/1679383.html

【編輯推薦】

  1. 淺談如何在SQL Server中生成腳本
  2. SQL Server使用索引實(shí)現(xiàn)數(shù)據(jù)訪問優(yōu)化
  3. SQL Server 05數(shù)據(jù)庫(kù)被置為“可疑”的解決方法
  4. 詳解SQL Server的版本區(qū)別及選擇
  5. SQL Server不存在或拒絕訪問故障的排除

 

 

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-10-29 17:33:51

VB.NET線程方法

2010-04-14 15:45:49

Oracle 數(shù)據(jù)庫(kù)

2010-05-20 14:52:42

MySQL數(shù)據(jù)庫(kù)

2010-06-07 15:09:44

訪問MySQL數(shù)據(jù)庫(kù)

2009-10-12 16:08:14

VB.NET訪問注冊(cè)表

2011-07-05 16:08:10

2011-05-20 08:54:35

PostgreSQL

2010-06-17 22:22:24

2009-07-29 09:12:31

ASP.NET數(shù)據(jù)庫(kù)連

2011-03-22 12:38:21

DB2數(shù)據(jù)庫(kù)游標(biāo)循環(huán)

2010-04-13 10:55:35

Oracle數(shù)據(jù)庫(kù)

2010-06-01 14:42:55

連接MySQL數(shù)據(jù)庫(kù)

2011-04-06 09:59:00

MySQL數(shù)據(jù)庫(kù)主從復(fù)制

2009-10-28 16:47:26

VB.NET訪問數(shù)據(jù)庫(kù)

2010-05-24 17:42:44

MySQL數(shù)據(jù)庫(kù)

2010-06-10 10:57:57

2009-12-23 15:53:36

ADO.NET訪問數(shù)據(jù)

2009-12-24 10:37:03

ADO.NET訪問數(shù)據(jù)

2010-06-11 13:22:32

2011-08-18 10:36:24

SQL ServerISNULL函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)