我正在努力理解tempDB
,以下是我脑海中浮现的疑惑。
tempDB
中数据的生命周期是多少?假设查询正在执行某些Order By
并使用tempDB
来执行此操作。此查询完成后,其他人也会执行使用tempDB
的查询。第二个查询是否会查找tempDB
中第一个查询所写的记录,还是会删除它们?tempDB
内创建了 可见 表吗?如何知道由于此查询而创建了哪个临时表?是否有任何命名约定后面的Sql引擎命名这些临时表?我是tempDB
的新手所以请原谅我提出这么愚蠢(如果有的话)的问题: - )
如果有人能指出一个可以帮助我了解tempDB的好资源,那将是非常好的。
答案 0 :(得分:15)
临时表存储在tempdb中,直到连接被删除(或者在使用它的最后一个连接被删除时的全局临时表的情况下)。您也可以(并且这是一个很好的做法)当您使用drop table语句完成它后,手动删除表。
不,如果它们是本地临时表,则其他人无法看到您的临时表(他们可以查看和使用全局临时表)多人可以运行使用相同临时表名称的命令,但它们不会在本地临时表中重叠所以你可以有一个名为#test的表,所以可以有10,000个其他用户,但每个用户都有自己的结构和数据。
您通常不希望在tempdb中查找临时表。可以检查是否存在,但这是我唯一一次直接引用tempdb。只需使用临时表名称即可。检查存在的示例
IF OBJECT_ID('TempDB.dbo.#DuplicateAssignments') IS NOT NULL
BEGIN
DROP TABLE #DuplicateAssignments
END
您可以通过在名称前面添加#来命名临时表(对于本地表,您将使用999.9%的时间)和##用于全局临时表,然后是您想要的其余名称。
答案 1 :(得分:2)
有一些MSDN文章可能是SQL Server中tempDB数据库的最佳信息来源。
tempdb系统数据库是全局的 所有人都可以使用的资源 用户连接到SQL实例 服务器并用于保存 以下内容:
- 显式创建的临时用户对象,例如:global或 本地临时表,临时的 存储过程,表变量或 光标。
- 由SQL Server数据库引擎创建的内部对象 例如,要存储的工作表 线轴或线轴的中间结果 排序
- 由a中的数据修改事务生成的行版本 使用read-committed的数据库 使用行版本控制隔离或 快照隔离事务。
- 由数据修改事务生成的行版本 功能,如:在线索引 操作,多个活动结果 设置(MARS)和AFTER触发器。
tempdb中的操作是最低限度的 登录。这使得交易成为可能 回滚。 tempdb被重新创建 每次启动SQL Server都是如此 系统始终以a开头 干净的数据库副本。临时 表和存储过程是 在断开时自动掉线, 当没有连接时,没有活动 系统关闭。因此,那里 永远不会是tempdb中的任何东西 从一个SQL Server会话中保存 到另一个。备份还原 tempdb上不允许进行操作。
还有tempdb and Index Creation,this blog post以及Working with tempdb in SQL Server 2005声明:
SQL Server系统数据库tempdb在SQL Server 2005中经历了许多更改.SQL Server 2005中有新的tempdb用法和内部优化;自SQL Server 2000以来,tempdb体系结构几乎没有变化。
tempdb系统数据库与用户数据库非常相似。主要区别在于SQL Server关闭后tempdb中的数据不会保留。
答案 2 :(得分:0)
查询完成后,将删除在TempDB中创建的临时表。
我不确定(我必须尝试),但我认为理论上在TempDB中创建的所有表都是可见的,尽管只有创建该表的用户才有权访问它。