我可以在存储过程中动态创建的临时表 (#temp) 上创建索引吗?

Nir*_*gan 4 sql sql-server stored-procedures nested temp-tables

我正在我的存储过程中创建临时表(#temp_table)。这是一个包含大量数据的巨大表。然后我在存储过程中创建索引,因为它需要更快地查询临时表。但是当我执行存储过程时,没有使用索引。执行存储过程时未创建索引。

伪代码

CREATE PROC abcdefg
AS
...
SELECT col_a, col_b, col_c....    
  INTO #temp_table
  FROM .....
  WHERE ....
...
CREATE INDEX abc_idx ON #temp_table (col_a)
...
SELECT col_a FROM #temp_table WITH (INDEX (abc_idx))
...
GO
Run Code Online (Sandbox Code Playgroud)

当我尝试执行存储过程时,它无法识别索引。我该如何解决这个问题?

OMG*_*ies 5

通常会发生这种情况,因为临时表的访问计划是在索引存在之前生成的。

幸运的是,您可以使用表级约束来解决这个问题。由于支持 UNIQUE 和 PRIMARY KEY 约束的索引与临时表同时定义,因此优化器将始终能够使用这些索引。

参考:优化临时表的性能/索引