Best Practices Analyzer Tool for Microsoft SQL Server 2000是Microsoft SQL Server開發團隊開發的資料庫管理工具,可以讓你偵測設計的資料庫是否遵循SQL Server操作和管理的最佳實務準則。這些準則公認有助於提高資料庫的效能和效率,並讓應用程式易於維護。
2,開始使用SQL BPA最佳實踐分析器
安裝完成後會有一個SQL Server Best Practices Analyzer User Guide的Word文檔,如何使用講解的很清楚,基本步驟如下:
(1)登入SQL BPA
(2)加入分析/偵測的SQL Server實例
這裡需要輸入SQL Server實例名稱,Friendly Name用來和後面建立Best Practice Group相關聯(和SQL Server實例名稱保持一樣就可以了)。 Database List的預設值為*,表示包含目前SQL Server執行個體的所有資料庫。但是,BPA會跳過對'master', 'tempdb', 'msdb', 'pubs', and 'northwind'等資料庫的偵測。
(3)管理Best Practice Groups(最佳實踐組)
首先需要建立一個Best Practice Group,其實是組合了一些Rules,並且和前面輸入的SQL Server實例進行關聯。
(4)分析SQL Server實例
將前面建立Best Practice Group移到Best Practice Groups to be Executed清單中,就可以按照前面定義的Rules來執行,並產生Report提供改進的建議和準則。
3,SQL BPA v1.0包含的Rules
我覺得這個是重點,因為只有明白了這些SQL Server操作和管理的最佳實踐準則,才能在設計資料庫和編寫T-SQL腳本時,盡量按照這些Rules來操作,提高SQL Server和應用程式的效能和效率。
其實所有的Rules都在這裡(English Version) file:///C:/Program%20Files/Microsoft%20SQL%20Server%20Best%20Practices%20Analyzer/html/RuleInformation.html#_Rule:_Explicit_Index_Creation ,請注意我是採用預設路徑安裝的SQL BPA,如果你改變的安裝路徑,就不在這裡了。
以下將一些自己比較有興趣的Rules整理了一下:
(1)資料庫設計
Rule: Tables without Primary Keys orUnique Constraints偵測資料庫確保所有的table都有定義一個Primary Key或一列有
Unique Constraint
的定義。
Rule: User Object Naming(使用者物件的命名)
偵測以sp_, xp_, or fn_為前綴命名的使用者對象,避免和SQL Server的內建物件發生命名衝突。如果SQL Server發現預存程序以sp_為前綴,就會先到master資料庫查詢這個預存程序,影響效能呵。
因此,要符合下列準則:
不要使用sp_前綴來命名使用者定義的預存程序;
不要使用xp_前綴來命名使用者定義的擴充預存程序;
不要使用fn_前綴來命名使用者定義的函數。
其實,可以透過使用usp_, uxp_, or ufn_等前綴來命名就可以了,u表示user defined。
(2)T-SQL
Rule: Cursor FOR UPDATE column list
偵測stored procedures, functions, views and triggers中FOR UPDATE子句。當一個cursor定義了FOR UPDATE子句,建議提供明確的column欄位。 FOR UPDATE用來定義cursor內可更新的欄位。如果提供了OF column_name,則只允許修改列出的欄位。如果在沒有指定列的列表,除非指定了READ_ONLY並發選項,否則所有列均可更新。 SQL Server可以基於指定的列來最佳化操作。
Rule: Cursor Usage
偵測stored procedures, functions, views and triggers中是否正確定義cursor可更新性。在下列情況下,會回報失敗:
當一個cursor沒有定義FOR UPDATE子句,但透過cursor來更新;
當一個cursor定義了FOR UPDATE子句,卻沒有透過cursor來更新。
不過,一般我們盡量避免使用伺服器端cursor,因為比較佔用伺服器記憶體資源,影響SQL Server的效能。可以使用巢狀查詢或WHILE語句,來取代cursor。即使使用cursor,也應注意定義cursor的一些選項,如FAST_FORWARD。
Rule: Explicit Index Creation
推薦使用CLUSTERED or NONCLUSTERED明確建立index。
Rule: INSERT Column List
要求在使用INSERT時,明確提供column列表,提高程式碼的可維護性。
Rule: Nested Triggers Configuration
檢測由於nested triggers的配置問題,未觸發的triggers。這個比較少有,直接貼過來了。
When 'nested triggers' configuration option is set to 0, any AFTER trigger defined on tables/views updated inside an INSTEAD OF trigger is not fired. This rule:
1) Checks the value of the configuration fired. This if 法.
2) Scans all INSTEAD OF triggers and generates a list of tables/view being target of DML from within a trigger.
3) Checks whether any of the identified DML targets have AFTER triggers defined on them.
4) for non-compm. case.
Rule: NOCOUNT Option in Triggers
檢測triggers,確保在triggers前面寫有SET NOCOUNT ON。
SQL Server在每一語句執行完成後,都會傳送'done'訊息。這些資訊會導致觸發trigger的應用程式可能產生一些意外的後果。因此,在trigger前面加上SET NOCOUNT ON是一個很好的設計習慣。
當然,在stored procedures, functions中都建議在前面加上SET NOCOUNT ON。這樣一系列SQL指令執行影響的行數不會傳回客戶端,減少網路流量,提高效能。
Rule: NULL Comparisons
偵測stored procedures, functions, views and triggers中涉及NULL常數的等於或不等於比較。建議設定ANSI_NULLS為ON,並使用IS關鍵字來呵NULL常數比較。
Rule: Results in Triggers
偵測triggers,確保triggers沒有資料回傳給呼叫者。因此,不建議在triggers中使用以下語句:
PRINT statement
SELECT (without assignment or INTO clause)
FETCH (without assignment)
Rule: Scoping of Transactions
偵測stored procedures and triggers中的transaction範圍,建議transaction的開始和結束在同一T-SQL結構內。
一般而言,盡量縮小transaction的範圍,避免佔用大量的資源,影響SQL Server效能。
Rule: SELECT *
偵測stored procedures, functions, views and triggers中SELECT *的使用。儘管SELECT * 比較方便,但是會降低程式的可維護性。對table or view的改變,可能會造成錯誤或效能的改變。
因此,建議在SELECT語句後面明確指定欄位清單。
Rule: SET Options
偵測stored procedures and triggers中如下SET語句的使用。
建議以下選項設定為ON:
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
推薦以下選項設定為OFF:
NUMERIC_ROUNDABOUT
Rule: Temp Table Usage
偵測stored procedures and triggers中臨時表的使用。當建立臨時表時,需要建立CREATE INDEX,並且在使用完成後,需要釋放該臨時表。
因為臨時表會產生大量的磁碟IO操作,因此建議採用TABLE變數來取代臨時表的使用。
不過,由於並發執行的限制和統計資訊的維護,當有大量的資料插入臨時表時,仍建議採用臨時表。
Rule: TOP without ORDER BY
偵測stored procedures, functions, views and triggers中缺少ORDER BY的TOP語句。使用TOP語句時,建議指定排序條件。否則,產生的結果將於SQL執行計劃相關而導致異常的行為。
Rule: Use of Schema Qualified Tables/Views
偵測stored procedures, functions, views and triggers中引用tables and views時,擁護者owner是否指定。雖然在SQL Server中引用特定的物件時,可以不指定server, database and owner(schema),也就是說不用server_name.database_name.owner_name.***這麼麻煩,但是SQL Server推薦當在stored procedure, function, view or trigger中引用table or view時,最好指定table or view的擁有者。
當SQL Server查詢未指定owner的table/view物件時,先查詢預設的owner,然後才是dbo。這樣,會導致SQL Server產品額外的運作成本。透過指定owner,可以改進SQL Server的效能。 (第一次聽到這種說法)
4,參考文件及相關資源
工具下載URL:
影片下載URL: