mssql过程优化方法
1.使用 SET NOCOUNT ON 语句作为过程主体中的第一个语句。 也就是说,将其放置于紧接着 AS 关键字之后。 这会禁止显示在执行任何 SELECT、INSERT、UPDATE、MERGE 和 DELETE 语句后 SQL Server 发送回客户端的消息。 这可确保最大限度地减少生成的输出内容,让人一目了然。 不过,对于当前的硬件,没有明显的性能优势。 有关信息,请参阅 SET NOCOUNT (Transact-SQL)。
2.当在过程中创建或引用数据库对象时使用架构名称。 如果不需要搜索多个架构,则数据库引擎解析对象名称时所需的处理时间会更少。 它还可以防止在未指定架构的情况下,创建对象期间分配用户默认架构时导致的权限和访问问题。
3.避免函数包装在 WHERE 和 JOIN 子句中指定的列。 这样做会使列具有不确定性并且禁止查询处理器使用索引。
4.避免在返回许多行数据的 SELECT 语句中使用标量函数。 因为标量函数必须应用于每一行,所以最终导致的行为将类似于基于行的处理并且会降低性能。
5.请避免使用 SELECT *。 而是应指定所需的列名。 这样做可以避免停止过程执行的数据库引擎错误。 例如,返回 12 列的表中的数据然后将数据插入 12 列临时表中的 SELECT * 语句将成功(在二表中任一表中列的数量或顺序发生更改之前)。
6.避免处理或返回过多的数据。 尽可能在过程代码中缩小结果的范围,这样,该过程执行的任何后续操作都将使用可能的最小数据集完成。 仅将基本数据发送到客户端应用程序。 它比跨网络发送多余的数据并且强制客户端应用程序处理不必要的大结果集更高效。
7.通过使用 BEGIN/COMMIT 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 运算符要求更少的处理开销,因为重复值不从结果集中筛选出来。

浙公网安备 33010602011771号