我的工作地点正在进行一项运动,以摆脱使用#temp 表,而是使用带有 SPID 的永久物理表。每当一个人以前插入到一个#temp 表中时,现在就需要一个- 以及在例如存储过程的开头的INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)
一堆语句。DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPID
此外,不用说,在使用这些“用于存储临时数据的永久表”的任何地方,都必须小心包含一个WHERE SPID = @@SPID
.
转向这种做法背后的逻辑是,它将提高运行查询的服务器的整体性能(通过减少 tempdb 中的 I/O 和争用)。出于多种原因,我不热衷于这种方法 - 它很丑陋,有潜在危险,而且似乎很可能会损害那些使用新方案的查询的性能。
有没有人对这种或类似的方法来消除#temp 表有任何经验?
可以很容易地证明它不会减少 IO 或争用,而是增加两者。
DELETE FROM @@spidTable WHERE spid = @@SPID
,因此将转换截断/创建操作(即页面范围管理操作)在行操作中,慢无比。因此,虽然您不会在 tempdb 中遇到神话般的 IAM/SGAM/GAM 争用,但发生这种情况的唯一原因是由于普通的额外 IO 和额外争用,您的操作将变得慢得多。
这似乎是一个激进的解决方案。网上有很多关于减少 tempdb 争用(并优化其使用)的文章——您的组织是否彻底检查了该途径?
http://www.sql-server-performance.com/tips/tempdb_p1.aspx
http://www.sqlservercentral.com/blogs/robert_davis/archive/2010/03/05/Breaking-Down-TempDB-Contention.aspx
http://searchsqlserver.techtarget.com/tip/Optimize-tempdb-in-SQL-Server-by-striping-and-splitting-to-multiple-files
等等
听起来你应该解决 tempDB 中的性能问题,这里有一些建议