5

是否有可能在 MS-SQL 中有一个“持久”临时表?我的意思是我目前有一个后台任务,它生成一个全局临时表,它被各种其他任务使用(这就是我将它设为全局的原因)。不幸的是,如果表变得未使用,它会被 SQL 自动删除——这由我的系统优雅地处理,因为它只是将它排队等待再次重建,但理想情况下我希望它每天只构建一次。所以,理想情况下,我可以设置一些超时参数,比如“如果 1 小时内没有任何东西触及这个,那么删除”。

我真的不希望它在我现有的数据库中,因为它会导致与管理数据库(碎片、日志增长等)相关的更多问题,因为它有效地汇总数据,仅在 24 小时内有用,并且占用更多超过 1 GB 的 HD 空间。

最坏的情况是,我的计划是在与 tempdb 相同的驱动器上创建另一个数据库,将其称为 PseudoTempDB 之类的东西,然后自己处理删除。

任何见解将不胜感激!

4

5 回答 5

9

如果您将表创建为 tempdb.dbo.TempTable,它不会被删除,直到:

a - SQL Server 已重新启动

b - 您明确删除它

如果您希望它始终可用,您可以在模型中创建该表,以便在重新启动期间将其复制到 tempdb(但它也将在您之后创建的任何新数据库上创建,因此您必须删除手动)或使用启动存储过程来创建它。但是,没有办法通过重新启动来保留数据。

于 2009-05-11T13:48:49.700 回答
4

我会采用您的计划 B,“在与 tempdb 相同的驱动器上创建另一个数据库,将其称为 PseudoTempDB,然后自己处理删除。”

于 2009-05-10T19:47:20.923 回答
3

如何创建一个永久表?说,MyTable。每 24 小时刷新一次数据,如下所示:

  1. 创建一个新表 MyTableNew 并填充它
  2. 在事务中,删除 MyTable,并使用 rename_object 将 MyTableNew 重命名为 MyTable

这样,您每天都在重新创建表格。

如果您担心日志文件,请将表存储在不同的数据库中并将其设置为恢复模式:简单。

于 2009-05-10T20:25:01.267 回答
2

我不得不承认对这个问题做了双重考虑:“持久”和“临时”通常不会一起出现!开箱即用的想法怎么样?也许您的后台任务可以定期运行一个简单的查询,以防止 SQL 将表标记为未使用。这样,您就可以直接控制创建和拆除。

于 2009-05-10T19:31:19.560 回答
2

在处理现有所有主要 RDBMS 的 20 年经验之后,我只能建议您考虑以下几点:

  1. 注意矛盾的概念:“持久”和“临时”是完全相反的。选择一个,并且只选择一个。

  2. 您不会对数据库有任何好处,因为手动、半永久性、用户驱动的基础将数据写入临时数据库。用于该目的的普通表空间(即用户)已经存在。临时数据库用于临时的东西。

  3. 如果您已经知道这样的表将被永久使用(“每日”是永久的),那么将其创建为用户数据库/模式上的普通表。

  4. 每次您删除并重新创建同一个表时,您都会对整个数据库进行分段。并且永远不会给 DB 引擎优化器机会来帮助您进行任何形式的粗略优化。相反,请尝试截断它。您的回滚段将感谢您的小幅缓解,并且当您第二天再次重新填充它时,可能仍会分配磁盘空间。您可以通过单独为该表指定单独的表空间和数据文件来强制执行所需的行为。

  5. 最后,也是更重要的一点:不要再为了区区 1 GB 的数据而折磨你和你的数据库引擎了。为了节省 0.02 美分的硬件真实状态,您正在浪费 CPU、I/O 周期、增加延迟、碎片等。谈论穿着燕尾服掉到地板上捡起棕色美分。

于 2020-07-25T01:03:36.170 回答