4

我正在#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

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

4

2 回答 2

4

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

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

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

于 2009-12-10T06:38:06.977 回答
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

带有包含实际执行计划的命令,它确实表明使用了索引。

于 2009-12-10T06:36:53.017 回答