2008-09-10 7 views
13

Si vous créez une table temporaire dans une procédure stockée et souhaitez y ajouter un ou deux index, pour améliorer les performances de toutes les instructions supplémentaires est la meilleure approche? Sybase dit this:Meilleure utilisation des index sur les tables temporaires dans T-SQL

« la table doit contenir des données lorsque l'index est créé Si vous créez la table temporaire et de créer l'index sur une table vide, Adaptive Server ne crée pas de statistiques de colonnes telles que les histogrammes et les densités Si.. vous insérez des lignes de données après la création de l'index, l'optimiseur a des statistiques incomplètes. "

mais récemment, un collègue a dit que si je crée la table temporaire et les indices dans une autre procédure stockée pour celui qui utilise en fait la table temporaire, puis Adaptive Server Optimiseur sera être en mesure de les utiliser. Dans l'ensemble, je ne suis pas un grand fan des procédures wrapper qui ajoutent peu de valeur, donc je n'ai pas vraiment essayé de tester cela, mais je pensais poser la question là-bas, pour voir si Quelqu'un at-il eu d'autres approches ou conseils?

Répondre

7

Quelques réflexions:

  • Si votre table temporaire est si grand que vous devez indexer, puis est-il une meilleure façon de résoudre le problème?
  • Vous pouvez le forcer à utiliser l'index (si vous êtes sûr que l'indice est la bonne façon d'accéder à la table) en donnant un indice de Optimiseur, de la forme:

    SELECT * 
    FROM #table (index idIndex) 
    WHERE id = @id 
    

Si vous êtes intéressé par des conseils de performance en général, j'ai répondu à quelques autres questions à ce sujet longuement ici:

3

Quel est le problème avec l'ajout des index après avoir mis des données dans la table temporaire?

Une chose que vous devez garder à l'esprit est la visibilité de l'indice à d'autres instances de la procédure qui pourrait être en cours d'exécution en même temps.

Je voudrais ajouter guid à ces types de tables temporaires (et aux index), pour vous assurer qu'il n'y a jamais un conflit. L'autre avantage de cette approche est que vous pouvez simplement faire de la table temporaire une vraie table.

Aussi, assurez-vous que vous devez interroger les données dans ces tables temporaires plus d'une fois pendant le déroulement de la procédure stockée, sinon le coût de la création d'index supérieur à l'avantage de la sélection.

1

Dans Sybase si vous créez une table temporaire puis l'utiliser dans un proc le plan de la sélection est construit en utilisant une estimation de 100 lignes de la table. (Le plan est créé lorsque la procédure démarre avant que les tables ne soient remplies.) Cela peut entraîner l'analyse de la table temporaire, car il ne s'agit que de "100 lignes". Si vous appelez un autre proc, Sybase crée le plan pour le select avec le nombre réel de lignes, ce qui permet à l'optimiseur de choisir un meilleur index à utiliser. J'ai vu des améliorations significatives en utilisant cette approche mais test sur votre base de données comme parfois il n'y a pas de différence.

Questions connexes