临时表需要唯一索引名称

时间:2017-06-29 19:07:32

标签: sql-server

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

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

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

那么,是否有人知道如何让SQL Server为临时表上的索引自动生成名称(除了将其作为CREATE TABLE语法的一部分)?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

由于这些是在存储过程中创建的临时表,因此它们需要具有唯一的名称,以避免在多个用户同时执行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

你可以运行

exec temptest
go 10

来自多个会议。