from : http://www.cnblogs.com/yxp132/articles/49224.html
Best Practices Analyzer Tool for Microsoft SQL Server 2000
是
Microsoft SQL Server
開發(fā)團(tuán)隊(duì)開發(fā)的一個數(shù)據(jù)庫管理工具,可以讓你檢測設(shè)計(jì)的數(shù)據(jù)庫是否遵循
SQL Server
操作和管理的最佳實(shí)踐準(zhǔn)則。這些準(zhǔn)則公認(rèn)有助于提高數(shù)據(jù)庫的性能和效率,并讓應(yīng)用程序易于維護(hù)。
?
1,安裝SQL BPA后,啟動界面如下所示:
2,開始使用SQL BPA最佳實(shí)踐分析器
安裝完成后會有一個
SQL Server Best Practices Analyzer User Guide
的
Word
文檔,如何使用講解的很清楚,基本步驟如下:
(
1
)登錄
SQL BPA
(
2
)添加分析
/
檢測的
SQL Server
實(shí)例
這里需要輸入
SQL Server
實(shí)例名稱,
Friendly Name
用來和后面創(chuàng)建
Best Practice Group
相關(guān)聯(lián)(和
SQL Server
實(shí)例名稱保持一樣就可以了)。
Database List
的缺省值為
*
,表示包含當(dāng)前
SQL Server
實(shí)例的所有數(shù)據(jù)庫。但是,
BPA
會跳過對‘
master
’
,?
‘
tempdb
’
,
‘
msdb
’
,?
‘
pubs
’
, and?
‘
northwind
’等數(shù)據(jù)庫的檢測。
(
3
)管理
Best Practice Groups
(最佳實(shí)踐組)
首先需要創(chuàng)建一個
Best Practice Group
,其實(shí)是組合了一些
Rules
,并和前面輸入的
SQL Server
實(shí)例進(jìn)行關(guān)聯(lián)。
(
4)
分析
SQL Server
實(shí)例
將前面創(chuàng)建
Best Practice Group
移到
Best Practice Groups to be Executed
列表中,就可以按照前面定義的
Rules
來執(zhí)行,并產(chǎn)生
Report
提供改進(jìn)的建議和準(zhǔn)則。
?
3,SQL BPA v1.0包括的Rules
我覺得這個是重點(diǎn),因?yàn)橹挥忻靼琢诉@些
SQL Server
操作和管理的最佳實(shí)踐準(zhǔn)則,才能在設(shè)計(jì)數(shù)據(jù)庫和編寫
T-SQL
腳本時,盡量按照這些
Rules
來操作,提高
SQL Server
和應(yīng)用程序的性能和效率。
其實(shí)所有的
Rules
都在這里(
English Version
)
file:///C:/Program%20Files/Microsoft%20SQL%20Server%20Best%20Practices%20Analyzer/html/RuleInformation.html#_Rule:_Explicit_Index_Creation
,請注意我是采用默認(rèn)路徑安裝的
SQL BPA
,如果你改變的安裝路徑,就不在這里了。
?
下面將一些自己比較感興趣的
Rules
整理了一下:
(
1
)數(shù)據(jù)庫設(shè)計(jì)
Rule: Tables without Primary Keys or Unique Constraints
檢測數(shù)據(jù)庫確保所有的
table
都有定義一個
Primary Key
或一列有
Unique Constraint
的定義。
?
Rule: User Object Naming
(用戶對象的命名)
檢測以
sp_, xp_, or fn_
為前綴命名的用戶對象,避免和
SQL Server
的內(nèi)置對象發(fā)生命名沖突。如果
SQL Server
發(fā)現(xiàn)存儲過程以
sp_
作為前綴,就會先到
master
數(shù)據(jù)庫中查詢這個存儲過程,影響性能呵。
因此,要符合下列準(zhǔn)則:
不要使用
sp_
前綴來命名用戶定義的存儲過程;
不要使用
xp_
前綴來命名用戶定義的擴(kuò)展存儲過程;
不要使用
fn_
前綴來命名用戶定義的函數(shù)。
其實(shí),可以通過使用
usp_, uxp_, or ufn_
等前綴來命名就可以了,
u
表示
user defined
。
?
(
2
)
T-SQL
Rule: Cursor FOR UPDATE column list
檢測
stored procedures, functions, views and triggers
中
FOR UPDATE
子句。當(dāng)一個
cursor
定義了
FOR UPDATE
子句,則推薦提供明確的
column
列。
FOR UPDATE
用來定義
cursor
內(nèi)可更新的列。如果提供了
?OF column_name
,則只允許修改列出的列。如果在沒有指定列的列表,除非指定了
READ_ONLY
并發(fā)選項(xiàng),否則所有列均可更新。
SQL Server
可以基于指定的列優(yōu)化操作。
?
Rule: Cursor Usage
檢測
stored procedures, functions, views and triggers
中是否正確定義
cursor
可更新性。在如下情況下,會報告失敗:
當(dāng)一個
cursor
沒有定義
FOR UPDATE
子句,但通過
cursor
來更新;
當(dāng)一個
cursor
定義了
FOR UPDATE
子句,卻沒有通過
cursor
來更新。
?
不過,一般我們盡量避免使用服務(wù)器端
cursor
,因?yàn)楸容^占用服務(wù)器內(nèi)存資源,影響
SQL Server
的性能。可以使用嵌套查詢或者
WHILE
語句,來代替
cursor
。即使使用
cursor
,也應(yīng)注意定義
cursor
的一些選項(xiàng),如
FAST_FORWARD
。
?
Rule: Explicit Index Creation
推薦使用
CLUSTERED or NONCLUSTERED
顯式創(chuàng)建
index
。
?
Rule: INSERT Column List
要求在使用
INSERT
時,明確提供
column
列表,提高代碼的可維護(hù)性。
?
Rule: Nested Triggers Configuration
檢測由于
nested triggers
的配置問題,未觸發(fā)的
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 option and exits if it is not 0.
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) Reports non-compliance for any such case.
?
Rule: NOCOUNT Option in Triggers
檢測
triggers
,確保在
triggers
前面寫有
SET NOCOUNT ON
。
SQL Server
在每一條語句執(zhí)行完成后,都會發(fā)送
’done’
信息。這些信息會導(dǎo)致觸發(fā)
trigger
的應(yīng)用程序可能產(chǎn)生一些意外的后果。因此,在
trigger
前面加上
SET NOCOUNT ON
是一個良好的設(shè)計(jì)習(xí)慣。
?
當(dāng)然,在
stored procedures, functions
中都推薦在前面添加
SET NOCOUNT ON
。這樣一系列
SQL
命令執(zhí)行影響的行數(shù)不會傳回客戶端,減少網(wǎng)絡(luò)流量,提高性能。
?
Rule: NULL Comparisons
檢測
stored procedures, functions, views and triggers
中涉及
NULL
常量的等于或不等于比較。推薦設(shè)置
ANSI_NULLS
為
ON
,并且使用
IS
關(guān)鍵字來呵
NULL
常量進(jìn)行比較。
?
Rule: Results in Triggers
檢測
triggers
,確保
triggers
沒有數(shù)據(jù)返回給調(diào)用者。因此,不推薦在
triggers
中使用如下語句:
PRINT statement
SELECT (without assignment or INTO clause)
FETCH (without assignment)
?
Rule: Scoping of Transactions
檢測
stored procedures and triggers
中的
transaction
范圍,推薦
transaction
的開始和結(jié)束在同一
T-SQL
結(jié)構(gòu)內(nèi)。
?
一般而言,盡量縮小
transaction
的范圍,避免占用大量的資源,影響
SQL Server
性能。
?
Rule: SELECT *
檢測
stored procedures, functions, views and triggers
中
SELECT *
的使用。盡管
SELECT *?
比較方便,但是會降低程序的可維護(hù)性。對
table or view
的改變,可能會引起錯誤或性能的改變。
因此,推薦在
SELECT
語句后面顯式指定字段列表。
?
Rule: SET Options
檢測
stored procedures and triggers
中如下
SET
語句的使用。
推薦如下選項(xiàng)設(shè)置為
ON:
-
ANSI_NULLS
-
ANSI_PADDING
-
ANSI_WARNINGS
-
ARITHABORT
-
CONCAT_NULL_YIELDS_NULL
-
QUOTED_IDENTIFIER
推薦如下選項(xiàng)設(shè)置為
OFF:
-
NUMERIC_ROUNDABOUT
Rule: Temp Table Usage
檢測
stored procedures and triggers
中臨時表的使用。當(dāng)創(chuàng)建臨時表時,需要創(chuàng)建
CREATE INDEX
,并且在使用完成后,需要釋放該臨時表。
因?yàn)榕R時表會產(chǎn)生大量的磁盤
IO
操作,因此推薦采用
TABLE
變量替換臨時表的使用。
不過,由于并發(fā)執(zhí)行的限制和統(tǒng)計(jì)信息的維護(hù),當(dāng)有大量的數(shù)據(jù)插入臨時表時,仍推薦采用臨時表。
?
Rule: TOP without ORDER BY
檢測
stored procedures, functions, views and triggers
中缺少
ORDER BY
的
TOP
語句。在使用
TOP
語句時,推薦指定排序條件。否則,產(chǎn)生的結(jié)果將于
SQL
執(zhí)行計(jì)劃相關(guān)而導(dǎo)致異常的行為。
?
Rule: Use of Schema Qualified Tables/Views
檢測
stored procedures, functions, views and triggers
中引用
tables and views
時,擁護(hù)者
owner
是否指定。雖然在
SQL Server
中引用特定的對象時,可以不指定
server, database and owner(schema)
,也就是說不用
server_name.database_name.owner_name.***
這么麻煩,但是
SQL Server
推薦當(dāng)在
stored procedure, function, view or trigger
中引用
table or view
時,最好指定
table or view
的擁有者。
?
當(dāng)
SQL Server
查詢未指定
owner
的
table/view
對象時,首先查詢?nèi)笔〉?
owner
,然后才是
dbo
。這樣,會導(dǎo)致
SQL Server
產(chǎn)品額外的運(yùn)行成本。通過指定
owner
,可以改進(jìn)
SQL Server
的性能。(第一次聽到這種說法)
?
4,參考文檔及相關(guān)資源
工具下載
URL:
視頻下載
URL:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
