普通表或全局临时表?

时间:2011-01-20 15:05:11

标签: sql-server temp-tables

我和另一位开发人员正在讨论哪种类型的表更适合我们的任务。它基本上是一个缓存,我们将在一天结束时截断。就个人而言,我认为没有任何理由为此使用除普通表之外的任何东西,但他想使用全局临时表。

对于其中一个有什么好处吗?

2 个答案:

答案 0 :(得分:5)

使用tempdb中的普通表,如果这只是您在服务重启时可以承受的瞬态数据,或者如果数据不是那么短暂的话,则可以使用用户数据库。

tempdb在记录要求方面略微提高效率。

一旦所有引用连接创建该表的连接被关闭,全局临时表就会被删除。

编辑:关注@ cyberkiwi的编辑。 BOL做definitely explicitly say

  

全局临时表可见   任何用户和他们之后的任何连接   已创建,并在全部删除   引用该表的用户   断开与SQL的实例   服务器

在我的测试中,我无法获得这种行为。

连接1

CREATE TABLE ##T (i int)
INSERT INTO ##T values (1)
SET CONTEXT_INFO 0x01

连接2

INSERT INTO ##T VALUES(4)
WAITFOR DELAY '00:01'
INSERT INTO ##T VALUES(5)

连接3

SELECT OBJECT_ID('tempdb..##T') 
declare @killspid varchar(10) = (select 'kill ' +  cast(spid as varchar(5)) from sysprocesses where context_info=0x01)
exec (@killspid)
SELECT OBJECT_ID('tempdb..##T') /*NULL - But 2 is still 
                                 running let alone disconnected!*/

答案 1 :(得分:2)

全球临时表

  • -ve:一旦连接that created表超出范围,就需要 与它的表。如果您使用可以不断交换连接并可能重置连接的连接池,则会造成损害
  • -ve:你需要继续检查表格是否已经存在(重启后),如果不存在则创建
  • + ve:简单的tempdb日志记录减少了I / O和CPU活动

普通表

  • + ve:正常日志记录会使您的缓存与主数据库保持一致。如果你的“缓存”被维护但仍然是关键任务,那么它将与db
  • 保持一致
  • -ve:从上面开始更多日志记录
  • + ve:表总是在,并且对于所有连接

如果缓存类似于业务/关键数据的快速查找摘要,即使它在一天结束时被重置/截断,我宁愿将其保留在db中的正常表中。