Question

Nous rencontrons des problèmes de performances lors de l'utilisation d'une variable de table dans une procédure stockée.

Voici ce qui se passe réellement:

DECLARE @tblTemp TABLE(iId_company INT)

INSERT INTO @tblTemp(iId_company)
  SELECT id FROM .....

Le SELECT retourne 138 résultats, mais l'insertion dans la variable TABLE prend 1min15 mais quand j'utilise une table temporaire avec le même SELECT, woops, prend 0sec:

CREATE TABLE #temp (iId_company INT)

INSERT INTO #temp(iId_company)
  SELECT id FROM ...

Qu'est-ce qui pourrait causer le comportement?

Était-ce utile?

La solution

Utilisez une table temporaire. Vous constaterez de bien meilleures performances.

Une explication détaillée du raisonnement derrière cela dépasse le cadre du premier question cependant pour résumer:

  • Une variable de table est optimisée pour un rangée, par SQL Server, c’est-à-dire qu’elle suppose 1 la ligne sera retournée.
  • Une variable de table ne crée pas statistiques.

Google table temporaire vs. table variable pour une multitude de ressources et de discussions. Si vous avez besoin d’une assistance spécifique, envoyez-moi un courrier électronique ou contactez-moi sur Twitter.

Autres conseils

En règle générale, pour les ensembles de données plus petits, une variable de table doit être plus rapide qu'une table temporaire. Les performances diminuent car les variables de table ne prennent pas en charge le parallélisme (voir cet article ).

Cela dit, je n’ai pas expérimenté, ni trouvé d’expérience avec un aussi petit ensemble de données étant plus lent pour une variable de table par rapport à une table temporaire.

Cela n’a aucune importance, mais à quoi ressemble votre choix? J'ai eu un problème dans SQL Server 2005, où mon choix lui-même était assez rapide pour ce que ma requête faisait, disons 5 minutes pour renvoyer toutes les données par le fil d'environ 150 000 lignes. Mais lorsque j'ai essayé d'insérer cette même sélection dans une table temporaire ou une variable de table, l'instruction a duré plus d'une heure avant de la tuer. Je n'ai pas encore compris ce qui se passait réellement. J'ai fini par ajouter l'ordre de force de l'indice de requête et il a commencé à insérer plus rapidement.

Le point clé concernant les tables temporaires est également que vous pouvez y mettre des index, etc. alors que vous ne pouvez pas utiliser de variables de table.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top