目录

文/温国兵

场景现象

中午查询了流水,因未与业务人员沟通好,忘了删选条件,导致TempDB不能分配空间,SQL Server高负载运行。

错误分析

我们来看看错误日志:

错误日志

再来看看TempDB自增长记录:

TempDB自增长记录

导致原因

查询语句未指定删选条件,语句如下:

--得到流水,因数据敏感问题,已将字段使用’xx’代替。
IF EXISTS (SELECT *
           FROM   tempdb..sysobjects
           WHERE  id = Object_id(N'tempdb..#t_scfw')
                  AND type = 'U')
  DROP TABLE #t_scfw;

IF NOT EXISTS (SELECT *
               FROM   tempdb..sysobjects
               WHERE  id = Object_id(N'tempdb..#t_scfw')
                      AND type = 'U')
  SELECT tsvr.*,
         bsl.xx AS xxx,
         bsl.xx,
         bsl.xx
  INTO   #t_scfw
  FROM   #t1 AS tsvr
         JOIN t2 AS bsl
           ON tsvr.xx = bsl.xx
              AND tsvr.xx = bsl.xx
              AND tsvr.xx = bsl.xx
              AND tsvr.xx = bsl.xx
              AND bsl.xx > 0;

总结

由于tempdb是存储在SSD上,且总大小为270G。所以,在显式使用临时表时一定要注意数据大小。避免把tempdb空间耗尽,影响整个SQLServer的正常运行。好在设置了tempdb的最大空间,并且最大空间小于SSD硬盘的最大容量,不然服务器的盘就会挂掉,从而导致服务器宕机,多么痛的领悟!切忌犯如此低级错误,作下此文提醒和鞭策自己,凡事三思而后行!

–EOF–

原文地址:深刻的教训-SQL Server关于TempDB的使用

题图来自:原创,By Robin Wen

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)