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 に答える