2019-04-24

存储过程最佳实践
1.使用 SET NOCOUNT ON 语句作为过程主体中的第一个语句。也就是说,将其放置于紧接着 AS 关键字之后。这会禁止显示在执行任何 SELECT、INSERT、UPDATE、MERGE 和 DELETE 语句后 SQL Server发送回客户端的消息。通过消除这一不必要的网络开销可以提高数据库和应用程序的总体性能。

2.当在过程中创建或引用数据库对象时使用架构名称。如果不必搜索多个架构,则这样做将会减少数据库引擎解析对象名称所用的处理时间。这样做还可以避免在创建对象时如果未指定架构,由要分配的用户的默认架构导致的权限和访问问题。

3.避免函数包装在 WHERE 和 JOIN 子句中指定的列。这样做会使列具有不确定性并且禁止查询处理器使用索引。

4.避免在返回许多行数据的 SELECT 语句中使用标量函数。因为标量函数必须应用于每一行,所以最终导致的行为将类似于基于行的处理并且会降低性能。

5.避免使用 SELECT *。而是应指定所需的列名称。这样做可以避免停止过程执行的数据库引擎错误。例如一个

SELECT * 语句,该语句从由 12 列构成的表返回数据,然后将这些数据插入一个由 12

列构成的临时表中,在更改这两个表中任何一个表的列数目或顺序前,该语句将成功执行。

6.避免处理或返回过多的数据。尽可能在过程代码中缩小结果的范围,这样,该过程执行的任何后续操作都将使用可能的最小数据集完成。仅将基本数据发送到客户端应用程序。它比跨网络发送多余的数据并且强制客户端应用程序处理不必要的大结果集更高效。

7.通过使用 BEGIN/END TRANSACTION 来使用显式事务并且保留尽可能短的事务。更长的事务意味着更长的记录锁定和更高的死锁风险。

8.使用 Transact-SQL TRY…CATCH 功能进行过程内的错误处理。TRY…CATCH 可以封装整个 Transact-SQL 语句块。这不仅产生更少的性能开销,还通过显著减少的编程,使错误报告更精确。

9.在过程主体中对 CREATE TABLE 或 ALTER TABLE Transact-SQL语句引用的所有表列使用 DEFAULT 关键字。这将禁止将 NULL 传递到不允许 Null值的列。

10.对于临时表中的每一列使用 NULL 或 NOT NULL。如果在 CREATE TABLE 或 ALTER TABLE 语句中未进行指定,则 ANSI_DFLT_ON 和ANSI_DFLT_OFF 选项将控制数据库引擎为列指派 NULL 或 NOT NULL 属性的方式。如果某个连接执行的过程对这些选项的设置与创建该过程的连接的设置不同,则为第二个连接创建的表列可能会有不同的为 Null性,并且表现出不同的行为。如果为每个列显式声明了 NULL 或 NOT NULL,那么将对所有执行该过程的连接使用相同的为 Null 性创建临时表。

11.使用将转换 Null 的修改语句并且包括从查询中删除含 Null 值的行的逻辑。请注意,在 Transact-SQL 中,NULL 不是空或者没有任何值。它是针对未知值的占位符并且可能导致意外的行为,特别是在查询结果集或使用 AGGREGATE 函数时。

12.使用 UNION ALL 运算符来代替 UNION 或 OR运算符,除非存在针对非重复值的特定需要。UNION ALL运算符要求更少的处理开销,因为重复值不从结果集中筛选出来。

你可能感兴趣的:(2019-04-24)