临时表需要唯一索引名称

Dea*_*one 2 sql-server

我正在更新一个遗留存储过程(它调用其他几个子存储过程。)在一个事务中,它处理大约十几个表中的数据并在这个过程中执行大量计算,有时会触发锁升级到一个表锁。在某些情况下,此过程可能需要 20 分钟或更长时间才能完成。显然,锁定那么长时间的表是一个很大的禁忌。所以我正在制定一个 2 阶段计划,以减少阶段 1 中此 sproc 造成的阻塞,并完全重写它以提高效率,而不是在阶段 2 中花费过多的时间。

为了减少阻塞,只要有对数据库表的操作,我计划将该操作移动到临时表中。通过在临时表中完成所有工作,然后在过程的最后用最终结果更新真实表,我应该能够显着减少阻塞其他用户所花费的时间。(这是第一阶段的“快速修复”。)

这是我的问题:当我将它们用于各种计算时,其中一些临时表中可能有 100,000 行或更多行。因此,我想在临时表上生成索引以保持性能。由于这些是在存储过程中创建的临时表,因此如果多个用户同时执行 sproc,它们需要具有唯一的名称以避免错误。我知道我可以使用 CREATE TABLE 语句手动声明临时表,如果我这样做,我可以指定一个没有名称的索引,并让 SQL Server 为我创建名称。我希望能够做的是使用 SELECT * INTO 生成临时表并找到另一种方法让 SQL Server 自动生成索引名称。我肯定你会问“为什么?” 我的公司对我的系统进行了几项更改 与我一起工作。如果我可以设法使用 SELECT INTO 方法,那么,如果添加列或调整列大小或其他任何内容,那么开发人员就不会遇到问题,需要知道他们必须返回到这些存储过程并更改它们的要匹配的临时表定义。使用 SELECT INTO 将自动保持临时表与“真实”表的布局相匹配。

那么,有没有人知道一种让 SQL Server 自动生成临时表上索引名称的方法(除了作为 CREATE TABLE 语法的一部分这样做)?

谢谢!

Dav*_*oft 7

由于这些是在存储过程中创建的临时表,因此如果多个用户同时执行 sproc,它们需要具有唯一的名称以避免错误。

不,他们没有。每个会话都有自己的临时表,它们会被自动清理。

并且索引没有全局名称范围,因此每个临时表可以具有相同的索引名称。例如

create procedure TempTest
as
begin
  select * into #t from sys.objects
  create index foo on #t(name)
  waitfor delay '00:00:10'
  select * from #t
end
Run Code Online (Sandbox Code Playgroud)

你可以跑

exec temptest
go 10
Run Code Online (Sandbox Code Playgroud)

来自多个会话。