Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 普通表还是全局临时表?_Sql Server_Temp Tables - Fatal编程技术网

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!*/