SQL Server 百万数据查询优化技巧三十则( 二 )


使用表变量代替临时表:eg:在一个小型数据集的情况下,可以使用表变量而不是创建临时表来存储中间结果 。例如,使用表变量替代以下的临时表:
-- 不推荐CREATE TABLE #TempResults (ID INT,Name VARCHAR(255),...-- 推荐DECLARE @TempResults TABLE (ID INT,Name VARCHAR(255),...);避免频繁创建和删除临时表:eg:在一个存储过程中,如果需要多次使用相同的临时表,不要在每次使用时都创建和删除 , 而是在存储过程的开头创建一次,最后删除 。
合理使用临时表:eg:在一个复杂的查询中,如果需要多次引用中间结果 , 可以考虑使用临时表 。但应注意不要滥用,确保临时表的使用是必要的 。
选择合适的临时表创建方式:eg:在需要一次性插入大量数据的情况下,可以使用 SELECT INTO 替代 CREATE TABLE 和 INSERT 的两步操作,以减少日志记录 。
-- 不推荐CREATE TABLE #TempTable (ID INT,Name VARCHAR(255),...);INSERT INTO #TempTableSELECT ID, Name, ...FROM SomeTable;-- 推荐SELECT ID, Name, ...INTO #TempTableFROM SomeTable;显式删除临时表:eg:在存储过程或脚本的最后,确保显式删除所有创建的临时表,以释放系统表资源 。
-- 不推荐DROP TABLE #TempTable;-- 推荐TRUNCATE TABLE #TempTable;DROP TABLE #TempTable;避免使用游标:eg:在一个订单表 Orders 中 , 避免使用游标来逐行处理数据,可以考虑使用集合操作或者其他优化方法 。
基于集的方法替代游标或临时表:eg:在需要对大量数据进行操作时,尽量寻找基于集的解决方案,以避免使用游标或临时表 。例如,使用窗口函数或联接来处理数据 。
存储过程中使用 SET NOCOUNT ON/OFF:eg:在存储过程中使用 SET NOCOUNT ON 和 SET NOCOUNT OFF,以减少向客户端发送 DONE_IN_PROC 消息,提高性能 。
-- 存储过程开头SET NOCOUNT ON;-- 存储过程结尾SET NOCOUNT OFF;避免大事务操作:eg:在一个银行交易表 Transactions 中,避免在一个事务中处理过多的交易记录,以提高系统并发能力 。
避免向客户端返回大数据量:eg:在一个日志表 Logs 中,如果查询可能返回大量的日志记录,应该审查客户端是否真的需要这么多数据,考虑分页或其他方式减少返回的数据量 。

  • SQL Server执行计划掌握:
使用EXPLAIN或Show Execution Plan分析查询执行计划,发现潜在问题 。
2、结语 熟悉其他数据库的同学应该也能对比出 , 很多数据库的优化经验是相通的,所以在学习其他数据库的时候可以借鉴已掌握的经验去对比学习,这样学习起来也会事半功倍 。




推荐阅读