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

时间:2009-12-10 06:21:42

标签: 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

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

2 个答案:

答案 0 :(得分:4)

这通常是因为临时表的访问计划是在索引存在之前生成的。

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

参考:Optimizing Performance / Indexes on Temp Tables

答案 1 :(得分:2)

我尝试了使用Sql Server 2005建议的代码

ALTER PROCEDURE Test
AS
BEGIN
    CREATE TABLE #Test (
            ID INT,
            Code VARCHAR(20)
    )
    CREATE INDEX test_ind ON #Test (Code)

    INSERT INTO #Test (ID,Code) SELECT ID, Code FROM MyTable

    SELECT Code
    FROM    #Test WITH(INDEX(test_ind))

    DROP TABLE #Test
END

运行

EXEC Test

包含实际执行计划的命令,它确实显示已使用索引。