我和另外一个开发者正在讨论我们的任务需要使用哪种类型的表。基本上它将成为一个缓存,我们将在一天结束时截断它。就我个人而言,我认为对于这个任务没有使用全局临时表的必要性,因此只用普通表就可以了。
有没有哪种方式更有优势呢?
我和另外一个开发者正在讨论我们的任务需要使用哪种类型的表。基本上它将成为一个缓存,我们将在一天结束时截断它。就我个人而言,我认为对于这个任务没有使用全局临时表的必要性,因此只用普通表就可以了。
有没有哪种方式更有优势呢?
tempdb
中使用普通表,或者如果数据不那么短暂,则在用户数据库中使用。从日志要求的角度来看,tempdb
稍微更有效率一些。尽管如此,在我的测试中,我无法获得这种行为。全局临时表在创建后对任何用户和任何连接都可见,并在所有引用该表的用户从SQL Server实例断开连接时被删除。
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!*/
全局临时表
普通表
如果缓存是业务/关键数据的快速查找摘要之类的东西,即使在一天的尾声被重置/截断,我仍然更喜欢将其保留为db中的普通表。
tempdb
在服务器重新启动时只需重新创建,因此不需要任何能力来回滚已提交并因此记录在事务日志中但尚未写入磁盘上的数据文件的事务) - Martin Smith