T-SQL的九个最佳实践

日期: 2013-12-19 作者:Basit Farooq翻译:Ranma 来源:TechTarget中国

SQL Server数据库在企业级的应用越来越广泛,良好的Transact-SQL(T-SQL)代码能够让SQL Server的性能更上一层楼。因此,SQL开发人员在编写代码的时候遵循T-SQL最佳实践和指导方针是非常重要的。本文着重分析了一些常见的T-SQL最佳实践,帮助用户确保SQL代码的可靠,健壮和高效。 选择合适的数据类型 创建一个表的时候,必须决定字段定义所要使用的数据类型。

数据类型定义了可以存储在一个字段中的数据种类。DBA可以使用数据类型来定义变量和存储过程的输入和输出参数。你必须为每个字段或变量选择一个数据类型以适配于存储在相应字段或变量中的数据。另外,还需要考虑存储需求并选择……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

SQL Server数据库在企业级的应用越来越广泛,良好的Transact-SQL(T-SQL)代码能够让SQL Server的性能更上一层楼。因此,SQL开发人员在编写代码的时候遵循T-SQL最佳实践和指导方针是非常重要的。本文着重分析了一些常见的T-SQL最佳实践,帮助用户确保SQL代码的可靠,健壮和高效。

选择合适的数据类型

创建一个表的时候,必须决定字段定义所要使用的数据类型。数据类型定义了可以存储在一个字段中的数据种类。DBA可以使用数据类型来定义变量和存储过程的输入和输出参数。你必须为每个字段或变量选择一个数据类型以适配于存储在相应字段或变量中的数据。另外,还需要考虑存储需求并选择高效率存储的数据类型。举个例子,想要存储介于0到255的正数时通常要用tinyint替代smallint,int或bigint。这是因为tinyint是一个固定的1字节字段,而smallint为2字节,int为4字节还有bigint为一个8字节的固定字段。

选择正确的数据类型还可以改善数据完整性。例如,如果为一个日期字段使用datetime数据类型,那么只有日期才能存储在此字段中。然而,如果为此字段使用字符或数字数据类型,那么最终的结果就可以在此字段中存储任何字符和数字类型的数据值,而它们并不代表一个日期。

最后,选择正确的数据类型会带来正确的执行计划,从而改善数据库性能。

避免使用DISTINCT和UNION语句

在T-SQL查询中放入一个DISTINCT语句可以去除查询结果中的重复记录。如果确信查询结果集只会包含独一无二的记录,那么T-SQL的最佳实践之一就是要避免使用DISTINCT语句,因为它会引起一个非必要的排序操作。

UNION语句通过从两个或多个SELECT语句中剔除重复记录同样加入了额外的排序操作。如果使用UNION来组合两个或更多个仅包含有单个数据集的SELECT语句,那么最好是使用UNION ALL语句。UNION ALL不会移除重复项,因此要求至少是SQL Server后端来处理执行联合操作。

避免使用NOLOCK查询提示

NOLOCK查询提示是最为常见的T-SQL最佳实践,但是它同时也可以是最差实践。大多数开发人员认为使用一个NOLOCK提示的风险就是会有获得不一致数据的可能,因为它只读取记录并不会等待提交其他诸如SELECT或UPDATE之类的SQL语句。这的确如此,但是它并不仅仅是读取未提交的记录。事务所做的要比选择,更新和删除记录要多的多。例如,事务经常会请求更新一个索引或是空间不足的数据页面。这可能会要求分配新的页面并对此新页面下已有的页面上的已有记录进行重定位,也就是页拆分。由于这个原因,可能会丢失几条记录或拥有重复记录,在没有NOLOCK查询提示的情况下执行查询通常是不允许的。

为SELECT和INSERT语句提供完整的字段列表

永远记住要为SELECT和INSERT语句提供所要求的完整字段列表。例如,如果在代码中或存储过程中使用SELECT * FROM,那么在每次执行SELECT语句的时候字段列表都要加以解析。此外,如果基表模式改变的话,SELECT和INSERT语句会产生一个错误或返回一个不同的字段集合。因此,当在执行选择的时候要避免使用SELECT * FROM [表名],并以完整字段列表取代,如下所示:

SELECT [col1],…[coln] FROM [TableName].

同样地,当执行插入时,在INSERT语句中使用字段列表,如下所示:

INSERT INTO [TableName] [col1],[col2]…[coln])

VALUES (‘Value1, Value2,…ValueN)

其他五个最佳实践

使用SET NOCOUNT ON。在批量,存储过程以及触发器中使用SET NOCOUNT ON可以提高性能。这是因为当指定了SET NOCOUNT ON,则语句就不会返回受影响记录的数量。

相比IN关键字推荐使用EXISTS关键字。当在检查记录存在情况的时候,更倾向于与使用EXISTS关键字而非IN关键字。这是因为IN关键字在列表上进行操作并在进一步进行处理前从子查询返回完整的结果集。

避免使用游标。要尽量避免使用游标。相反,要使用一个基于集合的方法从一个表向另一个表更新或插入数据。

避开动态SQL。避免使用动态SQL;尝试寻找不需要动态SQL的替代品。如果你使用动态SQL,要用sp_executesql来代替EXECUTE (EXEC),因为sp_executesql相比EXECUTE,前者更有效率且用途更多。它支持参数替换并且更有可能生成能被SQL Server重用的执行计划。

使用模式限定对象名称。对表名添加模式名前缀。例如,使用SELECT * FROM [模式名].[表名]来替代SELECT * FROM [表名]

作者

Basit Farooq
Basit Farooq

资深数据库管理员、培训师和技术撰稿人,具有十多年微软SQL Server平台的开发、技术培训和数据库管理的经验。

翻译

Ranma
Ranma

相关推荐