Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 显式删除临时表或让SQL Server处理它_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql server 显式删除临时表或让SQL Server处理它

Sql server 显式删除临时表或让SQL Server处理它,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,处理临时表下降的最佳实践是什么。我已经读到您应该显式地处理删除,并且sql server应该处理删除…正确的方法是什么?我一直认为,你应该自己清理你在存储过程中创建的临时表,等等。但是,后来我发现了其他一些建议 如有任何见解,将不胜感激。我只是担心我创建的临时表没有遵循最佳实践 谢谢 根据我的观点。无需显式删除临时表。SQL server将处理删除存储在临时数据库中的临时表,以防处理查询的空间不足。我的观点是,首先看看您是否真的需要临时表,或者您是否可以使用公共表表达式(CTE)。第二,我总是放

处理临时表下降的最佳实践是什么。我已经读到您应该显式地处理删除,并且sql server应该处理删除…正确的方法是什么?我一直认为,你应该自己清理你在存储过程中创建的临时表,等等。但是,后来我发现了其他一些建议

如有任何见解,将不胜感激。我只是担心我创建的临时表没有遵循最佳实践

谢谢


根据我的观点。无需显式删除临时表。SQL server将处理删除存储在临时数据库中的临时表,以防处理查询的空间不足。

我的观点是,首先看看您是否真的需要临时表,或者您是否可以使用公共表表达式(CTE)。第二,我总是放弃我的临时表。有时需要将临时表的作用域限定到连接(例如###temp),因此如果再次运行查询,并且有显式代码来创建临时表,则会出现一个错误,表明该表已经存在。清理自己是一个很好的软件实践。

在一个多线程的场景中,每个线程创建自己的一套表,线程的数量被节流,而不是放弃自己的表意味着州长会考虑你的线程完成并产生更多线程。但是,临时表仍然存在(因此与服务器的连接也存在),因此您将超出调控器的限制。如果手动删除临时表,那么线程将不会完成,直到它们被删除并且没有生成新线程,从而保持调控器防止SQL引擎崩溃的能力

临时表超出范围时会自动删除,除非使用DROP TABLE显式删除:

  • 在存储过程中创建的本地临时表将在存储过程完成时自动删除。该表可以由创建该表的存储过程执行的任何嵌套存储过程引用。调用创建该表的存储过程的进程无法引用该表
  • 在当前会话结束时,将自动删除所有其他本地临时表
  • 当创建表的会话结束并且所有其他任务停止引用全局临时表时,全局临时表将自动删除。任务和表之间的关联仅在单个Transact-SQL语句的生命周期内保持。这意味着在创建会话结束时,在最后一条主动引用表的Transact-SQL语句完成时,将删除全局临时表

我过去喜欢让后台服务器进程清理对象,但是,最近遇到TempDB日志文件增长过快的问题,这改变了我的看法。我不确定是否每个版本的SQL Server都是如此,但自从迁移到SQL 2016并将驱动器放在PureStorage SSD阵列上之后,情况就有点不同了。进程通常是CPU绑定的,而不是I/O绑定的,显式删除临时对象不会导致日志增长问题。虽然我还没有深入探究原因,但我怀疑这与.NET世界中的垃圾收集没有什么不同,在.NET世界中,显式调用垃圾收集时是同步的,而留给系统时是异步的。这很重要,因为显式删除会释放日志文件中的存储,并在下次日志备份时使其可用,而在不显式删除对象时,情况似乎并非如此。在大多数系统上,这可能不是一个大问题,但在一个支持大量ERP和web店面的系统上,有许多并发事务,并且大量使用TempDB,它产生了很大的影响。至于为什么要首先创建TempDB对象,因为大多数查询中都有大量的数据,它无论如何都会溢出到TempDB存储中,因此,使用必要的索引来创建对象通常比让系统自动处理更有效。

SQL Server会在本地
#temp
表超出范围时自动删除它们,所以这其实并不重要。不确定这种自动删除是否在作用域退出之前同步发生,因此与显式删除相比可能会有轻微的不同,但对于大型表,我认为删除无论如何都是延迟的。任何支持一种或另一种方法(特别是支持显式删除)的参数示例也将不胜感激。一、 首先,我不能真正证明显式删除是“最佳实践”,也不能说它总是多余的。另一方面,如果你真的告诉我们为什么你(或其他对此事的看法在某一点上对你来说似乎是明智的人)认为一种方法比另一种好,那么那些在该领域具有较高专业水平的人可能会给你一个非常好的答案。我发现这很难理解。@FistOfFury,调控器是一种限制线程创建的设备。一个有利的用例是,您可能需要在数据库中执行一系列任务,但您不想让服务器负担过重。。。在这种情况下,您有某种CPU利用率检测方案(或简单的线程限制),并且只根据iti生成新线程,我想我明白了。因此,这是一个特殊的用例,当您有一个进程并行地重复创建临时表时,它最终会淹没数据库。这是有道理的。我在这里遗漏了两件事:(1)调控器如何知道某个线程是否没有丢弃它的临时表?难道调控器不只是一个线程产卵器\杀手吗?(2)即使总督有这样的知识,什么使它认为是做了一个线程,没有放弃它的临时表。