在我们的解决方案中,我们在“ tempDB”中为活动创建了一些物理表。但是最近我们面临一个问题,即这些物理表将被自动删除。我们想知道此问题背后的可能原因/情况。
编辑: 是的,我认为不建议在“ tempdb”中创建物理表,但在这里我只是在寻找删除它的可能原因。
答案 0 :(得分:0)
哇-这确实很有趣。我很好奇你为什么这样实现。
我认为该策略最初对您有效,但现在不行吗? SQL Server将把tempDB增大到最佳大小,然后从中删除数据,但不收缩它。在任何给定的时间点,tempDB可能大部分都是空的。
也许您的tempDB现在正在满负荷运行,并且需要付出一些努力。负载可能发生一些变化-正在运行的查询类型等意味着您的表已被擦除。尝试增加它的大小或在另一个磁盘上创建另一个tempDB。
答案 1 :(得分:0)
MS SQL中有两种类型的临时表-local and global。
删除策略如下:
tempDB
数据库表也将在启动时清除。
tempDB
中存储着其他类型的表。其中一个称为表变量(前缀为@
),另一个称为 persisted 临时表(创建时不使用任何前缀)。
仅在重新启动SQL服务时,才会删除持久的临时表。
答案 2 :(得分:0)
来自docs:
每次启动SQL Server时都会重新创建tempdb ,以便 系统始终以数据库的干净副本开始。临时 断开连接后,表和存储过程将自动删除, 系统关闭时,没有连接处于活动状态。因此, tempdb 中永远不会从一个SQL会话中保存任何内容 服务器到另一个。不允许进行备份和还原操作 tempdb。
这意味着在重新启动服务后,不仅物理表而且其他对象(如触发器,权限,视图等)也将消失。这就是为什么您不应该对用户对象使用tempdb
。
您可以在自己的数据库中创建一个架构,并保留一个SQL Agent Job,该应用程序偶尔会一次删除其所有表,因此您可以模仿一个“临时”物理表空间来解决该问题。