Sql server 普通表还是全局临时表?
我和另一位开发人员正在讨论哪种类型的表更适合我们的任务。它基本上是一个缓存,我们将在一天结束时截断它。就我个人而言,我看不出有任何理由使用普通表以外的任何东西,但他希望使用全局临时表Sql server 普通表还是全局临时表?,sql-server,temp-tables,Sql Server,Temp Tables,我和另一位开发人员正在讨论哪种类型的表更适合我们的任务。它基本上是一个缓存,我们将在一天结束时截断它。就我个人而言,我看不出有任何理由使用普通表以外的任何东西,但他希望使用全局临时表 这两者之间有什么好处吗?如果这只是暂时性数据,您可以在服务重新启动时丢失,则使用tempdb中的普通表;如果数据不是暂时性的,则使用用户数据库 tempdb在日志记录要求方面稍有效率 一旦所有引用连接都被删除(创建表的连接被关闭),全局临时表就会被删除 编辑:跟随@cyberkiwi的编辑。波尔有 全局临时表对用户
这两者之间有什么好处吗?如果这只是暂时性数据,您可以在服务重新启动时丢失,则使用
tempdb
中的普通表;如果数据不是暂时性的,则使用用户数据库
tempdb
在日志记录要求方面稍有效率
一旦所有引用连接都被删除(创建表的连接被关闭),全局临时表就会被删除
编辑:跟随@cyberkiwi的编辑。波尔有
全局临时表对用户可见
任何用户和他们之后的任何连接
创建,并在所有
正在引用表的用户
断开与SQL实例的连接
服务器
在我的测试中,我也没有得到这种行为
连接1
连接2
连接3
全局临时表
- -ve:一旦创建表的连接
超出范围,就需要 桌子上放着它。如果您使用连接池,它可以不断地交换连接并可能重置连接,那么这是有害的
- -ve:您需要不断检查表是否已经存在(重新启动后),如果不存在,则创建它
- +ve:简单地登录tempdb可以减少I/O和CPU活动
- +ve:正常日志记录会将缓存保存在主数据库中。如果您的“缓存”得到维护,但仍然是任务关键型的,这将使其与数据库保持一致
- -ve:从上面开始更多日志记录
- +ve:桌子总是放在周围,而且对于所有的连接
如果缓存类似于业务/关键数据的快速查找摘要,即使它在一天结束时被重置/截断,我更愿意在数据库中保留一个正常的表。你能澄清一下tempdb如何更有效吗?@Jeremy-它将以
简单的恢复模式开始,而你的其他数据库可能不是。但即使没有这一点,它所需要的日志记录也比在具有简单恢复模型的用户数据库中要少,因为它不必记录在服务器崩溃时允许它重做事务的内容。(tempdb
只是在服务器重新启动时重新创建,因此不需要任何前滚事务的功能,这些事务已提交并因此记录在事务日志中,但尚未写入光盘上的数据文件)我在测试##temp表的生命周期时得到了与您类似的结果。不确定BOL的确切含义。这让我觉得,如果它们是通过存储过程引用的,可能会有所不同,但我还没有对此进行测试(还有其他事情要做!)
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!*/