1、在查询中不要使用“select *” 检索不必要的列会带来额外的系统开销,有句话叫做“该省的则省”;
2、在select清单中避免不必要的列,在连接条件中避免不必要的表;
3、不要在子查询中使用count()求和执行存在性检查
4、避免使用两个不同类型的列进行表的连接
5、避免死锁
6、避免使用count(*)获得表的记录数
(1)为了获得表中的记录数,我们通常使用下面的SQL 语句: SELECT COUNT(*) FROM dbo.orders 这条语句会执行全表扫描才能获得行数。 (2)但下面的SQL 语句不会执行全表扫描一样可以获得行数: SELECT rows FROM sysindexes
WHERE id = OBJECT_ID('dbo.Orders') AND indid < 2
7、避免使用动态SQL。(1)动态SQL 难以调试和故障诊断; (2)如果用户向动态SQL 提供了输入,那么可能存在SQL 注入风险。
8、在写存储过程中,在开始写set nocount on ,结束写set nocount off
(当 SET NOCOUNT 为 ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。 当 SET NOCOUNT 为 OFF 时,返回计数(默认为OFF)。
即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。
当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn 行受影响"。
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
注释当SET NOCOUNT 为ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。当SET NOCOUNT 为OFF 时,返回计数。 ... 结论:我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上SET NOCOUNT OFF这样的话,以达到优化)