2009-12-10 8 views
4

Je crée des tables temporaires (#temp_table) dans ma procédure stockée. C'est une énorme table avec de grandes données. Ensuite, je crée un index dans la procédure stockée car il est nécessaire pour accélérer la requête à la table temporaire. Mais lorsque j'exécute la procédure stockée, l'index n'est pas utilisé. L'index n'est pas créé lorsque la procédure stockée est exécutée.Puis-je créer un index sur des tables temporaires (#temp) créées dynamiquement dans une procédure stockée?

Code Pseudo

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 

Lorsque je tente d'exécuter la procédure stockée, il ne reconnaît pas l'indice. Comment puis-je résoudre ce problème?

+0

Ceci est pour MS SQL? – Thilo

Répondre

1

J'ai essayé le code que vous a suggéré d'utiliser 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 

Lors de l'exécution du

EXEC Test 

Commande avec Inclure plan d'exécution réel, il montre que l'indice a été utilisé.

+0

Merci Astander pour votre réponse rapide. J'ai testé votre solution et cela fonctionne bien. La différence semble être avec la façon dont les procs stockés exécutent les requêtes "SELECT INTO #temp" et "CREATE TABLE #temp". Une autre solution moins préférable consiste à créer le proc stocké avec l'option "with recompile". Cela a encore fonctionné. Encore une fois merci pour votre aide. –

4

Cela se produit généralement parce que les plans d'accès pour les tables temporaires ont été générés avant que les index aient jamais existé.

Heureusement, vous pouvez utiliser des contraintes de niveau table pour contourner ce problème. Les index prenant en charge les contraintes UNIQUE et PRIMARY KEY étant définis en même temps que la table temporaire, l'optimiseur pourra toujours utiliser ces index.

Référence: Optimizing Performance/Indexes on Temp Tables

+0

Merci OMG. Votre suggestion était utile. –

+1

@Ponies - l'article que vous avez référencé date de 2004, mais est-il prudent de supposer que le conseil en ce qui concerne les tables #temp est toujours "la meilleure pratique"? – mg1075