SQLServer 資料庫開發頂級技巧

2022-09-28 19:39:24 字數 2503 閱讀 5217

確保**中的資料型別與資料庫中的列型別保持一致

確保您的應用程式各層資料型別保持一致是非常重要的。例如www.cppcns.com,如果一列的資料型別為nvarchar(50),那麼,您應該在**查詢與儲存過程中使用相同型別的區域性變數。

同樣,資料層中的ado.net**也應該指定相同的資料型別與長度。為什麼這很重要呢?因為如果資料型別與查詢匹配,sql s程式設計客棧erver需要先進行資料型別的隱式轉換,以使它們能夠匹配。

也有一些情況,即使為參照列設定了索引,sql server卻不能使用此索引。因此,變數與列型別一致的情況下,您的查詢可能會使用index scan而不是index seeking,這樣需要執行的時間就更長了。

在批處理中進行大規模更新

開發人員有時需要對一張表中的一列或多列中的全部或大部分列進行資料修改。通常,對小表而言這並不是乙個什麼問題。

然而,如果表很大的話,您的更新語句將鎖定整張表,使它無法使用,甚至都不能讀取。更有甚者,對一張頻繁變化的表進行更新可能使整個應用程式或**癱瘓。有時,在極端情況下,乙個大的、單個事務將導致事務日誌急劇增長,並最終耗盡資料庫伺服器磁碟空間。

因此,好的策略是進行分批大規模更新,並結合頻繁的事務日誌備份。以我的經驗看,最好一批10,000至50,000工作量。當您開始考慮應用批量處理時,確定閾值很困難,因為這取決於諸多因素比方說如何使i/o更快,如何使表高效利用等等。

您可以考慮乙個準則。在ado.net中,典型的命令超時時間是30秒左右。當開始更新時,其他程序一直處於等待狀態直到更新結束。因此如果期望更新時間超過20-25秒,您最好進行乙個批處理更新。否則,將以應用程式超時而結束。

下面這段簡單的**展示了如何更新表中的一列,應用的批量大小為10,000:

while ( 0 = 0 )

begin

update top ( 10000 )

person

set status = 2

where status = 1

if @@rowcount = 0

break

end

應用for-each儲存過程

有些時候您可能需要對某一特定型別的所有物件執行相同的操作。例如,您可能需要對資料庫中的所有表分配特定的許可權。開發人員經常通過指標設定這樣的任務,但是sql server中兩個簡單的儲存過程可以更容易實現:sp_msforeachtable 與 sp_msforeachdb。

每個儲存過程作為乙個引數執行命令。在命令中,您把表名或資料庫名作為乙個問號標誌佔位符嵌入到引數中。命令執行時,sql server把問號標誌替換為表名或資料庫名,並執行。

例如,下面的**在server上除tempdb外,對每個資料庫進行全備份:

exec sp_msforeachdb 'if ''?'' <> ''tempdb'' backup database ?

to disk=''c:\backups\?.bak'' with init'

這是另外乙個如何應用這些儲存過程的例子。下面的**在禁用外來鍵後,刪除資料庫所有表中的資料。當然了,當使用這些**時,您需要謹慎的練習。

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'

建立資料庫版本

對開發人員而言,如同對您的應用程式版本化一樣,對資料庫執行數字版本化是乙個很好的方法。

執行版本化並不需要很大的工作量,您只需建立乙個包含版本號列及時間戳列的版本表即可。當部署那些指令碼時,您將更好的分配每個指令碼集合的版本號,並對版本表進行更新,檢查錯誤與資料庫對比將程式設計客棧變得更加容易。您甚至可以對指令碼進行編號,這樣一來如果資料庫中建立的編號不比指令碼中建立的編號高的話,指令碼就不執行。樣例資料庫adwww.cppcns.comventureworks中的awbuildversion就是乙個很好的例子,可以看看。

儘量減少網路會話

這個技巧主要針對從資料庫取資料的網路應用程式。缺乏經驗的開發人員常常意識不到資料庫呼叫是代價很高的操作。對於小應用程式而言,這不是什麼大問題。但是,由於很多**變得非常火爆導致數以千計的使用者同時**,那麼您就有必要提前考慮它的可擴充套件性與網頁載入時間的優化問題了。

我曾經看到過的網頁有多達15個資料庫呼叫,而大多數正在執行的儲存過程就是為了返回單獨的一行或乙個值。需要牢記的是在sql server中乙個單獨的儲存過程能夠返回多個結果集。在乙個儲存過程中,您可以使用ado.net中的dataset物件以及把datatable物件組成乙個集合。

本文標題: sqlserver 資料庫開發頂級技巧

本文位址: /shujuku/mssql/50268.html

SQLserver本地資料庫開發

遠端端資料庫中生成指令碼 注意 遠端端的資料庫 是中文版的還是英文版的,一般我們裝的是英文版的,如果遠端端資料庫是中文版的,那麼我們本地的是英文版,在生成的指令碼那需要修改,同時去除相應的路勁 修改為 如果我們想用vs自帶的db作為本地資料庫,那麼我們用 localdb mssqllocaldb 連...

資料庫開發010建立SQL Server儲存過程

開啟ssms,新建新查詢 use sales gocreate procedure domo proc name char 16 sql server major int 2005,minor int 0 asprint name str major,5 str minor,5 儲存過程類似程式語言...

資料庫開發基礎 SQl Server 鏈結查詢

連線查詢 通過連線運算子可以實現多個表查詢。連線是關聯式資料庫模型的主要特點,也是它區別於其它型別資料庫管理系統的乙個標誌。1.joinon 2.union 在關聯式資料庫管理系統中,表建立時各資料之間的關係不必確定,常把乙個實體的所有資訊存放在乙個表中。當檢索資料時,通過連線操作查詢出存放在多個表...