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.
有关更多详细信息,请参阅本文:TF1118的误解.
小智 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)