tempDB如何工作?

时间:2009-10-20 14:52:14

标签: sql sql-server tempdb

我正在努力理解tempDB,以下是我脑海中浮现的疑惑。

  1. tempDB中数据的生命周期是多少?假设查询正在执行某些Order By并使用tempDB来执行此操作。此查询完成后,其他人也会执行使用tempDB的查询。第二个查询是否会查找tempDB中第一个查询所写的记录,还是会删除它们?
  2. Sql Engine在tempDB内创建了 可见 表吗?如何知道由于此查询而创建了哪个临时表?是否有任何命名约定后面的Sql引擎命名这些临时表?
  3. 我是tempDB的新手所以请原谅我提出这么愚蠢(如果有的话)的问题: - )

    如果有人能指出一个可以帮助我了解tempDB的好资源,那将是非常好的。

3 个答案:

答案 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 Database

  

tempdb系统数据库是全局的   所有人都可以使用的资源   用户连接到SQL实例   服务器并用于保存   以下内容:

     
      
  • 显式创建的临时用户对象,例如:global或   本地临时表,临时的   存储过程,表变量或   光标。
  •   
  • 由SQL Server数据库引擎创建的内部对象   例如,要存储的工作表   线轴或线轴的中间结果   排序
  •   
  • 由a中的数据修改事务生成的行版本   使用read-committed的数据库   使用行版本控制隔离或   快照隔离事务。
  •   
  • 由数据修改事务生成的行版本   功能,如:在线索引   操作,多个活动结果   设置(MARS)和AFTER触发器。
  •   
     

tempdb中的操作是最低限度的   登录。这使得交易成为可能   回滚。 tempdb被重新创建   每次启动SQL Server都是如此   系统始终以a开头   干净的数据库副本。临时   表和存储过程是   在断开时自动掉线,   当没有连接时,没有活动   系统关闭。因此,那里   永远不会是tempdb中的任何东西   从一个SQL Server会话中保存   到另一个。备份还原   tempdb上不允许进行操作。

还有tempdb and Index Creationthis 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)

  1. 查询完成后,将删除在TempDB中创建的临时表。

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