为什么不能在 SNAPSHOT 隔离的临时表上创建索引?

Tom*_*rek 7 sql-server snapshot-isolation temporary-tables

当我尝试在使用SNAPSHOT事务隔离时在 SQL Server 中的临时表上创建索引时,出现此错误:

事务失败,因为在快照隔离事务中不允许使用此 DDL 语句。由于元数据没有版本控制,如果在快照隔离中混合使用元数据更改可能会导致不一致。

为什么在使用快照时不允许在 SQL Server 中的临时表上创建索引

我不明白这一点,如果允许我创建临时表,为什么不允许我向它们添加索引?

Dav*_*oft 11

在现代版本的 SQL Server (2014+) 中,您可以在创建表时创建索引,例如:

create table #t(id int primary key, a int, index ix_a nonclustered(a))
Run Code Online (Sandbox Code Playgroud)

您也可以在快照事务开始之前创建临时表。

几乎所有的 DDL 在一个SNAPSHOT事务中都是被禁止的。 ALTER TABLE并且TRUNCATE TABLE显然是不允许的。 CREATE TABLE被列入白名单。 CREATE INDEX 可以被列入白名单,但根本不是。

  • 更具体地说,我认为 CREATE INDEX 只是没有列入白名单*一般* - 引擎不会检查它是否适用于#temp表或其他东西。它可能将 CREATE INDEX ON # 列入白名单,但不能列入 ## 或永久名单。但它没有,今天。 (4认同)
  • 是的,在#temp 上创建索引会更简单,因为会话会看到它们自己的更改,因此您不必“修复”新索引的版本存储。 (2认同)