SQL Server SELECT INTO和使用临时表阻止

Mit*_*ers 26 sql-server stored-procedures temp-tables sqlperformance

所以,最近DBA试图告诉我们我们不能使用的语法

SELECT X, Y, Z
INTO #MyTable
FROM YourTable
Run Code Online (Sandbox Code Playgroud)

在我们的环境中创建临时表,因为该语法会在执行存储过程的持续时间内导致TempDB锁定.现在,我发现了一些详细说明临时表如何工作,执行范围,清理等的东西.但是对于我的生活,由于它们的使用,我没有看到任何关于阻挡的事情.

我们试图找到证据,证明我们不应该经历并为所有临时表执行CREATE TABLE #MyTable ...但是双方都无法找到证据.我正在寻找人们所拥有的任何见解.

附加信息

目前正在使用SQL Server 2005,很快将成为SQL Server 2008(企业版)

Bra*_*adC 34

这个建议已经流传了很长时间:

SQL Server 6.5中的瓶颈

许多人使用SELECT ... INTO查询来创建临时表,如下所示:

从SourceTable中选择*INTO #TempTable

虽然这有效,但它会在SELECT语句的持续时间内针对tempdb数据库创建锁定(如果您在源表中拖拽大量数据,则会持续一段时间,如果SELECT ... INTO在开始时则会更长时间一个运行时间较长的显式事务)当锁定到位时,没有其他用户可以创建临时表.瓶颈的实际位置是对tempdb系统表的锁定.在SQL Server的更高版本中,锁定模型已更改,并且避免了问题.

幸运的是,这只是SQL 6.5的一个问题.它在7.0及更高版本中得到修复.


Rem*_*anu 17

这可能会浮动很长一段时间,为各种"顾问"的口袋提供食物.像所有神话一样,它有一个真实的核心和很多BS.

事实是:SQL 2000和以前的版本已知存在tempdb中分配范围的争用问题.实际上,争用在所有数据库中都是正确的,但由于一些繁重的tempdb使用,在tempdb中更明显.它记录在KB328551中:

当大量使用tempdb数据库时,SQL Server在尝试分配页面时可能会遇到争用.

从sysprocesses系统表输出,waitresource可能显示为"2:1:1"(PFS页面)或"2:1:3"(SGAM页面).根据争用程度,这可能还会导致SQL Server在短时间内出现无响应.

这些操作大量使用tempdb:
重复创建和删除临时表(本地或全局).
使用tempdb进行存储的表变量.
与CURSORS关联的工作表.
与ORDER BY子句关联的工作表.
与GROUP BY子句关联的工作表.
与HASH PLANS相关的工作文件.

大量使用这些活动可能会导致争用问题.

-T1118SQL Server 2000 SP3中添加了一个跟踪标志,该标志强制SQL使用循环算法进行混合页面分配.当与在一组相同大小的文件(每个CPU一个)上部署tempdb的实践相关联时,这种新算法将减轻争用.跟踪标志仍然存在于SQL 2005/2008中,尽管它不太可能需要.

关于这个神话的其他一切都是BS.

  • 是否使用#temp表导致阻塞?在最坏的情况下,它会增加 SQL 2000及更早版本中的负载争用,但这远远不能说它会阻止任何事情.您必须首先测量并发现是这种情况,如果是这样,请部署补救措施(为每个CPU分配一个tempdb文件,使它们大小相同,打开-T1118).
  • 选择...进入#temp会在选择期间阻塞某些内容吗?并不是的.
  • 在包含select的存储过程的持续时间内,选择...到#temp块中的东西吗?一定不行.只是阅读那个说法而我大笑起来.

有关更多详细信息,请参阅本文:TF1118的误解.

  • 如果 [select ... into #temp] 在事务中,在事务提交之前,[select * from sysobjects] 将在任何其他会话中被阻止。 (2认同)

小智 10

为什么不这样做呢?

SELECT X, Y, Z
INTO #MyTable
FROM YourTable
WHERE 1 = 2
Run Code Online (Sandbox Code Playgroud)

该语句将立即运行 - 创建临时表并避免任何可能的锁定.然后你可以像往常一样插入它:

INSERT #MyTable
SELECT X, Y, Z
FROM YourTable
Run Code Online (Sandbox Code Playgroud)