濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQLServer 數(shù)據(jù)庫開發(fā)頂級技巧

SQLServer 數(shù)據(jù)庫開發(fā)頂級技巧

熱門標(biāo)簽:知名電銷機器人價格 菏澤語音電銷機器人加盟公司 分享百度地圖標(biāo)注多個位置 電銷機器人公司 需要哪些牌照 地圖標(biāo)注牌 湖南電腦外呼系統(tǒng)平臺 廣東防封卡外呼系統(tǒng)原理是什么 長沙智能外呼系統(tǒng) 外呼系統(tǒng)改進
確保代碼中的數(shù)據(jù)類型與數(shù)據(jù)庫中的列類型保持一致
  確保您的應(yīng)用程序各層數(shù)據(jù)類型保持一致是非常重要的。例如,如果一列的數(shù)據(jù)類型為NVARCHAR(50),那么,您應(yīng)該在代碼查詢與存儲過程中使用相同類型的局部變量。
  同樣,數(shù)據(jù)層中的ADO.NET代碼也應(yīng)該指定相同的數(shù)據(jù)類型與長度。為什么這很重要呢?因為如果數(shù)據(jù)類型與查詢匹配,SQL Server需要先進行數(shù)據(jù)類型的隱式轉(zhuǎn)換,以使它們能夠匹配。
  也有一些情況,即使為參照列設(shè)置了索引,SQL Server卻不能使用此索引。因此,變量與列類型一致的情況下,您的查詢可能會使用Index Scan而不是Index Seeking,這樣需要執(zhí)行的時間就更長了。
在批處理中進行大規(guī)模更新
  開發(fā)人員有時需要對一張表中的一列或多列中的全部或大部分列進行數(shù)據(jù)修改。通常,對小表而言這并不是一個什么問題。
  然而,如果表很大的話,您的更新語句將鎖定整張表,使它無法使用,甚至都不能讀取。更有甚者,對一張頻繁變化的表進行更新可能使整個應(yīng)用程序或網(wǎng)站癱瘓。有時,在極端情況下,一個大的、單個事務(wù)將導(dǎo)致事務(wù)日志急劇增長,并最終耗盡數(shù)據(jù)庫服務(wù)器磁盤空間。
  因此,好的策略是進行分批大規(guī)模更新,并結(jié)合頻繁的事務(wù)日志備份。以我的經(jīng)驗看,最好一批10,000至50,000工作量。當(dāng)您開始考慮應(yīng)用批量處理時,確定閾值很困難,因為這取決于諸多因素比方說如何使I/O更快,如何使表高效利用等等。
  您可以考慮一個準(zhǔn)則。在ADO.NET中,典型的命令超時時間是30秒左右。當(dāng)開始更新時,其他進程一直處于等待狀態(tài)直到更新結(jié)束。因此如果期望更新時間超過20-25秒,您最好進行一個批處理更新。否則,將以應(yīng)用程序超時而結(jié)束。
  下面這段簡單的代碼展示了如何更新表中的一列,應(yīng)用的批量大小為10,000:
  WHILE ( 0 = 0 )
  BEGIN
  UPDATE TOP ( 10000 )
  Person
  SET Status = 2
  WHERE Status = 1
  IF @@ROWCOUNT = 0
  BREAK
  END
  應(yīng)用FOR-EACH存儲過程
  有些時候您可能需要對某一特定類型的所有對象執(zhí)行相同的操作。例如,您可能需要對數(shù)據(jù)庫中的所有表分配特定的權(quán)限。開發(fā)人員經(jīng)常通過指針設(shè)置這樣的任務(wù),但是SQL Server中兩個簡單的存儲過程可以更容易實現(xiàn):sp_msForEachTable 與 sp_msForEachDB。
  每個存儲過程作為一個參數(shù)執(zhí)行命令。在命令中,您把表名或數(shù)據(jù)庫名作為一個問號標(biāo)志占位符嵌入到參數(shù)中。命令運行時,SQL Server把問號標(biāo)志替換為表名或數(shù)據(jù)庫名,并執(zhí)行。
  例如,下面的代碼在Server上除TempDB外,對每個數(shù)據(jù)庫進行全備份:
  EXEC sp_msforeachdb 'IF ''?'' > ''tempdb'' BACKUP DATABASE ?
  TO DISK=''c:\backups\?.bak'' WITH INIT'
  這是另外一個如何應(yīng)用這些存儲過程的例子。下面的代碼在禁用外鍵后,刪除數(shù)據(jù)庫所有表中的數(shù)據(jù)。當(dāng)然了,當(dāng)使用這些代碼時,您需要謹(jǐn)慎的練習(xí)。
  EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
  EXEC sp_MSForEachTable '
  IF OBJECTPROPERTY(object_id(''?''), ''TableHasForeignRef'') = 1
  DELETE FROM ?
  else
  TRUNCATE TABLE ?
  '
  EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
  建立數(shù)據(jù)庫版本
  對開發(fā)人員而言,如同對您的應(yīng)用程序版本化一樣,對數(shù)據(jù)庫執(zhí)行數(shù)字版本化是一個很好的方法。
  執(zhí)行版本化并不需要很大的工作量,您只需創(chuàng)建一個包含版本號列及時間戳列的版本表即可。當(dāng)部署那些腳本時,您將更好的分配每個腳本集合的版本號,并對版本表進行更新,檢查錯誤與數(shù)據(jù)庫對比將變得更加容易。您甚至可以對腳本進行編號,這樣一來如果數(shù)據(jù)庫中建立的編號不比腳本中建立的編號高的話,腳本就不執(zhí)行。樣例數(shù)據(jù)庫AdventureWorks中的AWBuildVersion就是一個很好的例子,可以看看。
  盡量減少網(wǎng)絡(luò)會話
  這個技巧主要針對從數(shù)據(jù)庫取數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用程序。缺乏經(jīng)驗的開發(fā)人員常常意識不到數(shù)據(jù)庫調(diào)用是代價很高的操作。對于小應(yīng)用程序而言,這不是什么大問題。但是,由于很多網(wǎng)站變得非常火爆導(dǎo)致數(shù)以千計的用戶同時在線,那么您就有必要提前考慮它的可擴展性與網(wǎng)頁加載時間的優(yōu)化問題了。
  我曾經(jīng)看到過的網(wǎng)頁有多達15個數(shù)據(jù)庫調(diào)用,而大多數(shù)正在執(zhí)行的存儲過程就是為了返回單獨的一行或一個值。需要牢記的是在SQL Server中一個單獨的存儲過程能夠返回多個結(jié)果集。在一個存儲過程中,您可以使用ADO.NET中的DataSet對象以及把DataTable對象組成一個集合。

標(biāo)簽:福建 美容院 呼和浩特 天水 珠海 泉州 商洛 西寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQLServer 數(shù)據(jù)庫開發(fā)頂級技巧》,本文關(guān)鍵詞  SQLServer,數(shù)據(jù)庫,開發(fā),頂級,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQLServer 數(shù)據(jù)庫開發(fā)頂級技巧》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQLServer 數(shù)據(jù)庫開發(fā)頂級技巧的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    平南县| 信阳市| 嘉祥县| 临沧市| 泽州县| 新营市| 筠连县| 奉节县| 徐汇区| 阿克陶县| 崇义县| 大厂| 南通市| 泰宁县| 盐津县| 康平县| 大庆市| 湘乡市| 马龙县| 新平| 南皮县| 汝州市| 晋宁县| 北川| 安宁市| 文山县| 会昌县| 青州市| 西藏| 吉木萨尔县| 岗巴县| 长丰县| 托克逊县| 离岛区| 永城市| 逊克县| 黄冈市| 白河县| 健康| 南开区| 寿阳县|