我正在我的存储过程中创建临时表(#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
当我尝试执行存储过程时,它无法识别索引。我该如何解决这个问题?
答案 0 :(得分:4)
这通常是因为临时表的访问计划是在索引存在之前生成的。
幸运的是,您可以使用表级约束来解决此问题。由于支持UNIQUE和PRIMARY KEY约束的索引与临时表同时定义,因此优化器将始终能够使用这些索引。
答案 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
包含实际执行计划的命令,它确实显示已使用索引。