SQL Server中的临时表是否需要显式删除?

所周知, 临时表的特性如下,生命周期跟连接有关。

[sql]  view plain  copy
 print ?
  1. /*  
  2. 1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。     
  3. 2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。     
  4. 3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。     
  5. */  

那程序中到底是否应该显式地删除临时表呢?

很多人认为, 既然生命周期就是创建到连接关闭, 那我关闭连接就可以了呀, 这不是省了好多事吗?
到底是不是这样, 让我们来做个试验:

[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Data.SqlClient;  
  6.   
  7. namespace ConsoleApplication10  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             string[] titleArr = { "带连接池""默认不写连接池相关内容""不带连接池" };  
  14.             string[] connStringArr ={  
  15.                 @"data source=(local)\sqlserver2014;initial catalog=tempdb;Integrated Security=True;pooling=true;Min Pool Size=5;Max Pool Size=512;",  
  16.                 @"data source=(local)\sqlserver2014;initial catalog=tempdb;Integrated Security=True;",  
  17.                 @"data source=(local)\sqlserver2014;initial catalog=tempdb;Integrated Security=True;pooling=false" };  
  18.             string[] sqlArr = {  
  19.                 @"create table #tmpLocalWithPool(id int);create table ##tmpGolbalWithPool(id int)",  
  20.                 @"create table #tmpLocal(id int);create table ##tmpGolbal(id int)",  
  21.                 @"create table #tmpLocalWithoutPool(id int);create table ##tmpGolbalWithoutPool(id int)"  
  22.             };  
  23.   
  24.             for (int i = 0; i < titleArr.Length; i++)  
  25.             {  
  26.                 try  
  27.                 {  
  28.                     using (SqlConnection conn = new SqlConnection(connStringArr[i]))  
  29.                     {  
  30.                         conn.Open();  
  31.                         SqlCommand cmd = new SqlCommand(sqlArr[i], conn);  
  32.                         cmd.ExecuteNonQuery();  
  33.                     }  
  34.                     Console.WriteLine(titleArr[i] + " 执行成功!");  
  35.                 }  
  36.                 catch (Exception ex)  
  37.                 {  
  38.                     Console.WriteLine(titleArr[i] + "执行失败!原因:" + ex.Message);  
  39.                 }  
  40.             }  
  41.   
  42.             Console.Read();  
  43.         }  
  44.     }  
  45. }  



注意:运行完毕先不要关闭控制台, 看一下对应 tempdb 库中的情况:


很明显, 带连接池的和不写连接池的都没有主动清除, 只有不用连接池的才帮我们清除了。


不写连接池,其实也是开启了的(默认开启连接池, 最小0, 最大100)。点击打开链接

其实也相当于是带连接池。


但生产环境的应用,有多少同学敢不用连接池?

用连接池,但又不主动删除, 最终会导致 tempdb 庞大无比, 一堆垃圾占用着宝贵的系统资源……


当然, 不仅是程序, SSMS等客户端开查询窗口也是一样的, 也需要显式删除临时表。

见过有人导报表一直不关闭窗口, 查一个新开一个, 临时表也不显式删除, 最终导致C盘爆满(tempdb放在了C盘)。


勿以善小而不为, 勿以恶小而为之。

不管哪里, 还是养成好习惯——临时表用完就主动 drop 吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值