16

我试图理解tempDB以下是我脑海中浮现的疑问。

  1. 数据的生命周期是tempDB多少?假设查询正在执行某些操作Order BytempDB用于执行该操作。此查询完成后,其他人也执行了一个使用tempDB. 第二个查询会找到第一个查询写入的记录tempDB还是会被删除?
  2. Sql Engine内部是否创建了任何可见的表?tempDB我怎么知道由于这个查询而创建了哪个临时表?Sql 引擎是否有任何命名约定来命名这些临时表?

我是新手,tempDB所以请原谅我问了这么愚蠢(如果有的话)的问题:-)

如果有人能给我指出一个可以帮助我了解 tempDB 的好资源,那就太好了。

4

3 回答 3

19

临时表存储在 tempdb 中,直到连接被删除(或者在全局临时表的情况下,当使用它的最后一个连接被删除时)。您还可以(并且这样做是一个很好的做法)在使用 drop table 语句完成使用表时手动删除该表。

不,如果他们是本地临时表,其他人看不到您的临时表(他们可以看到和使用全局临时表)多个人可以运行使用相同临时表名称的命令,但它们不会在本地临时表中重叠,所以你可以有一个名为#test 的表,10,000 个其他用户也可以,但每个用户都有自己的结构和数据。

您通常不想在 tempdb 中查找临时表。可以检查是否存在,但这是我唯一一次直接引用 tempdb。只需使用您的临时表名称。下面检查存在的示例

  IF OBJECT_ID('TempDB.dbo.#DuplicateAssignments') IS NOT NULL 
  BEGIN 
  DROP TABLE #DuplicateAssignments 
  END  

您可以通过在名称前面加上 # (对于本地表,您将在 999.9% 的时间使用的表)和 ## 为全局临时表命名临时表,然后是您想要的名称的其余部分。

于 2009-10-20T15:01:31.043 回答
3

有几篇 MSDN 文章可能是有关 SQL Server 中 tempDB 数据库的最佳信息来源。

临时数据库

tempdb 系统数据库是一个全局资源,可供连接到 SQL Server 实例的所有用户使用,用于保存以下内容:

  • 显式创建的临时用户对象,例如:全局或本地临时表、临时存储过程、表变量或游标。
  • SQL Server 数据库引擎创建的内部对象,例如,用于存储假脱机或排序的中间结果的工作表。
  • 由使用行版本控制隔离或快照隔离事务的已提交读的数据库中的数据修改事务生成的行版本。
  • 由功能的数据修改事务生成的行版本,例如:在线索引操作、多个活动结果集 (MARS) 和 AFTER 触发器。

tempdb 中的操作被最低限度地记录。这使事务能够回滚。每次启动 SQL Server 时都会重新创建 tempdb,以便系统始终以干净的数据库副本启动。临时表和存储过程在断开连接时自动删除,并且在系统关闭时没有任何连接处于活动状态。因此,tempdb 中永远不会有任何内容要从 SQL Server 的一个会话保存到另一个会话。不允许在 tempdb 上执行备份和还原操作。

还有tempdb 和 Index Creation这篇博客文章以及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 中的数据不会保留。

于 2009-10-20T15:09:35.137 回答
0
  1. 查询完成时将删除在 TempDB 中创建的临时表。

  2. 我对此不确定(我必须尝试一下),但我认为理论上在 TempDB 中创建的所有表都是可见的,尽管只有创建表的用户有权访问它。

于 2009-10-20T14:59:04.503 回答