zoukankan      html  css  js  c++  java
  • Best Practices Analyzer Tool for Microsoft SQL Server 2000

    from :http://www.cnblogs.com/yxp132/articles/49224.html


    Best Practices Analyzer Tool for Microsoft SQL Server 2000Microsoft SQL Server开发团队开发的一个数据库管理工具,可以让你检测设计的数据库是否遵循SQL Server操作和管理的最佳实践准则。这些准则公认有助于提高数据库的性能和效率,并让应用程序易于维护。

     

    1,安装SQL BPA后,启动界面如下所示:


    2,开始使用SQL BPA最佳实践分析器

    安装完成后会有一个SQL Server Best Practices Analyzer User GuideWord文档,如何使用讲解的很清楚,基本步骤如下:

    1)登录SQL BPA

    2)添加分析/检测的SQL Server实例

    这里需要输入SQL Server实例名称,Friendly Name用来和后面创建Best Practice Group相关联(和SQL Server实例名称保持一样就可以了)。Database List的缺省值为*,表示包含当前SQL Server实例的所有数据库。但是,BPA会跳过对‘mastertempdb,msdbpubs, 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 Versionfile:///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 or Unique 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

     

    2T-SQL

    Rule: Cursor FOR UPDATE column list

    检测stored procedures, functions, views and triggersFOR 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 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在每一条语句执行完成后,都会发送’done’信息。这些信息会导致触发trigger的应用程序可能产生一些意外的后果。因此,在trigger前面加上SET NOCOUNT ON是一个良好的设计习惯。

     

    当然,在stored procedures, functions中都推荐在前面添加SET NOCOUNT ON。这样一系列SQL命令执行影响的行数不会传回客户端,减少网络流量,提高性能。

     

    Rule: NULL Comparisons

    检测stored procedures, functions, views and triggers中涉及NULL常量的等于或不等于比较。推荐设置ANSI_NULLSON,并且使用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 triggersSELECT *的使用。尽管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 BYTOP语句。在使用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查询未指定ownertable/view对象时,首先查询缺省的owner,然后才是dbo。这样,会导致SQL Server产品额外的运行成本。通过指定owner,可以改进SQL Server的性能。(第一次听到这种说法)

     

    4,参考文档及相关资源

    工具下载URL:

    http://www.microsoft.com/downloads/details.aspx?FamilyId=B352EB1F-D3CA-44EE-893E-9E07339C1F22&displaylang=en

    视频下载URL:

    http://www.microsoft.com/china/msdn/events/webcasts/shared/msdntv/episode.aspx?xml=/china/msdn/events/webcasts/msdntv/20040610sqlserverck/manifest.xml

  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/Amaranthus/p/2142953.html
Copyright © 2011-2022 走看看