性能/空间sql:选择一个@变量或一个临时变量

性能/空间sql:选择一个@变量或一个临时变量,sql,sql-server,sql-server-2008,tsql,sql-server-2012,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,我的存储过程出现以下错误: 无法为对象“dbo”分配空间。大型对象存储系统 数据库“tempdb”中的对象:422213818384384',因为“主” 文件组已满 在我的查询中,我使用了很多临时表。我想知道: 在性能/空间方面,什么是更好的?将临时表或表变量与SELECT INTO一起使用是否有区别 例如: select * into #temp1 from myTable select * into #temp2 from #temp1 --then add some columns

我的存储过程出现以下错误:

无法为对象“dbo”分配空间。大型对象存储系统 数据库“tempdb”中的对象:422213818384384',因为“主” 文件组已满

在我的查询中,我使用了很多临时表。我想知道:

在性能/空间方面,什么是更好的?将临时表或表变量与SELECT INTO一起使用是否有区别

例如:

select * 
into #temp1 from myTable

select * 
into #temp2 from #temp1

--then add some columns on temp2 and do some joins with temp1

如果使用@temp1和@temp2,同样的选择/连接会更好吗?

正如其他人所说,在空间和性能方面,实际上没有什么区别。有一种误解,认为表变量存储在RAM中,这是不正确的。两者都在tempdb空间中分配

错误消息表明tempdb使用的文件已用完分配的空间,这可能需要寻址,tempdb空间不足可能是一个严重的问题

一般的经验法则是,首先避免创建不必要的对象,即临时表/临时数据集,并让SQL Server以最简单的方式尽最大努力优化查询

如果您创建两个临时表,而不查看数据/查询,那么将生成两倍的数据量,因此可能会使问题更加严重


根据您发布的内容,您应该避免使用临时表/表变量,而是使用普通查询。您可以使用子查询或通用表表达式来降低查询复杂性。

是的,表变量和临时表虽然都使用TempDb,但它们是不同的

选择表变量和临时表的基本经验法则是,在处理较少的数据量时,应该选择表变量。表变量本身不涉及事务、锁定和日志记录,因此它们相对更快


除此之外,临时表允许您在其上具有索引,它们与临时数据库TempDb上存在的普通表一样。不要创建太多临时表,因为TempDb必须执行除处理用户定义的临时对象之外的各种其他操作。所以,在您的情况下,您可以选择具有适当索引的物理表。我相信,您正在处理许多blob对象,它们在两种情况下都使用TempDb,即table variable和temp table

它们应该是等价的。你能在过程执行期间删除中间临时表吗?你无论如何不能选择…到表变量中。我错了,但你知道我的意思。set@var='select*from mytable'与select…intodb的区别是什么?如果tempdb空间不足,您需要尽快获得更多的磁盘空间。当然,您的进程可能会臃肿,但如果它接近耗尽空间,它可能会再次发生。根据我的经验,在孩子们的体育比赛期间或午夜,这总是最糟糕的时刻。在白天分配一些磁盘空间,并修复占用tempdb的代码。@eric,我想我可以删除其中一些。