3

要选择与数百个 ID 列表相关的信息...而不是做一个巨大的选择语句,我创建临时表,将 ID 插入其中,将其与表连接以选择与 ID 匹配的行,然后删除临时表桌子。所以这本质上是一个读取操作,不会对任何持久性数据库表进行永久性更改。

我在事务中执行此操作,以确保完成后删除临时表。我的问题是......当我提交这样的事务与让它回滚时会发生什么?

性能方面......数据库引擎是否需要做更多的工作来回滚事务而不是提交事务?由于唯一的修改是对临时表进行的,因此甚至有区别吗?

这里的相关问题,但没有回答我涉及临时表的具体案例:我应该提交还是回滚读取事务?

编辑(澄清问题):

在提交/回滚之前不寻求建议。交易是绝对必要的。假设没有错误发生。假设我已经创建了一个临时表,假设我知道发生了对 tempdb 的真正“工作”写入,假设我在事务中执行只读(选择)操作,并假设我在临时表上发出了删除语句。毕竟......哪个更便宜,提交或回滚,为什么?基于这种涉及临时表和其他只读操作的特定场景,数据库引擎在那个点可能为提交与回滚做哪些其他工作?

4

2 回答 2

3

如果我们谈论的是本地临时表(即名称以单个 为前缀#),则在您关闭连接的那一刻,SQL Server 将终止该表。因此,假设您的数据层经过精心设计以尽可能短地保持连接打开,我不会担心将临时表的创建包装在事务中。

我想将表包装在事务中可能会有轻微的性能差异,但我敢打赌,与由于创建和填充临时表的时间而使事务保持更长时间的成本相比,它是如此之小以至于无关紧要。

于 2010-05-21T01:02:01.063 回答
0

确保删除临时表的更简单方法是使用# 符号创建它。

CREATE TABLE #mytable ( rowID int, rowName char(30) )

# 告诉 SQL Server 该表是本地临时表。此表仅对 SQL Server 的此会话可见。当会话关闭时,该表将被自动删除。您可以像对待任何其他表一样处理此表,但有一些例外。唯一真正的主要问题是您不能在临时表上设置外键约束。其他的在联机丛书中都有介绍。

在 tempdb 中创建临时表。

如果您这样做,您将不必将其包装在事务中。

于 2010-05-21T01:04:12.433 回答