我和另一位开发人员正在讨论哪种类型的表更适合我们的任务。它基本上是一个缓存,我们将在一天结束时截断。就个人而言,我认为没有任何理由为此使用除普通表之外的任何东西,但他想使用全局临时表。
对于其中一个有什么好处吗?
答案 0 :(得分:5)
使用tempdb
中的普通表,如果这只是您在服务重启时可以承受的瞬态数据,或者如果数据不是那么短暂的话,则可以使用用户数据库。
tempdb
在记录要求方面略微提高效率。
一旦所有引用连接创建该表的连接被关闭,全局临时表就会被删除。
编辑:关注@ cyberkiwi的编辑。 BOL做definitely explicitly say
全局临时表可见 任何用户和他们之后的任何连接 已创建,并在全部删除 引用该表的用户 断开与SQL的实例 服务器
在我的测试中,我无法获得这种行为。
CREATE TABLE ##T (i int)
INSERT INTO ##T values (1)
SET CONTEXT_INFO 0x01
INSERT INTO ##T VALUES(4)
WAITFOR DELAY '00:01'
INSERT INTO ##T VALUES(5)
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)
全球临时表
that created
表超出范围,就需要
与它的表。如果您使用可以不断交换连接并可能重置连接的连接池,则会造成损害普通表
如果缓存类似于业务/关键数据的快速查找摘要,即使它在一天结束时被重置/截断,我宁愿将其保留在db中的正常表中。