Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quelle est la différence entre une table temporaire et une variable de table dans SQL Server ?

Il existe quelques différences entre les tables temporaires (#tmp) et les variables de table (@tmp), bien que l'utilisation de tempdb n'en fasse pas partie, comme indiqué dans le lien MSDN ci-dessous.

En règle générale, pour les volumes de données petits à moyens et les scénarios d'utilisation simples, vous devez utiliser des variables de table. (Il s'agit d'une directive trop large avec bien sûr de nombreuses exceptions - voir ci-dessous et les articles suivants.)

Quelques points à considérer lors du choix entre eux :

  • Les tables temporaires sont de vraies tables, vous pouvez donc faire des choses comme CRÉER DES INDEX, etc. Si vous avez de grandes quantités de données pour lesquelles l'accès par index sera plus rapide, les tables temporaires sont une bonne option.

  • Les variables de table peuvent avoir des index en utilisant les contraintes PRIMARY KEY ou UNIQUE. (Si vous voulez un index non unique, incluez simplement la colonne de clé primaire comme dernière colonne dans la contrainte unique. Si vous n'avez pas de colonne unique, vous pouvez utiliser une colonne d'identité.) SQL 2014 a aussi des index non uniques .

  • Les variables de table ne participent pas aux transactions et SELECT s sont implicitement avec NOLOCK . Le comportement de la transaction peut être très utile, par exemple si vous souhaitez effectuer un ROLLBACK au milieu d'une procédure, les variables de table renseignées lors de cette transaction seront toujours renseignées !

  • Les tables temporaires peuvent entraîner la recompilation des procédures stockées, peut-être souvent. Les variables de tableau ne le seront pas.

  • Vous pouvez créer une table temporaire à l'aide de SELECT INTO, qui peut être plus rapide à écrire (bon pour les requêtes ad hoc) et peut vous permettre de gérer l'évolution des types de données au fil du temps, car vous n'avez pas besoin de définir la structure de votre table temporaire à l'avance.

  • Vous pouvez retransmettre des variables de table à partir de fonctions, ce qui vous permet d'encapsuler et de réutiliser la logique beaucoup plus facilement (par exemple, créez une fonction pour diviser une chaîne en une table de valeurs sur un délimiteur arbitraire).

  • L'utilisation de variables de table dans des fonctions définies par l'utilisateur permet d'utiliser ces fonctions plus largement (voir la documentation CREATE FUNCTION pour plus de détails). Si vous écrivez une fonction, vous devez utiliser des variables de table plutôt que des tables temporaires, sauf en cas de nécessité impérieuse.

  • Les variables de table et les tables temporaires sont stockées dans tempdb. Mais les variables de table (depuis 2005) utilisent par défaut le classement de la base de données actuelle par rapport aux tables temporaires qui prennent le classement par défaut de tempdb (ref). Cela signifie que vous devez être conscient des problèmes de classement si vous utilisez des tables temporaires et que votre classement de base de données est différent de celui de tempdb, ce qui pose des problèmes si vous souhaitez comparer les données de la table temporaire avec les données de votre base de données.

  • Les tables temporaires globales (##tmp) sont un autre type de table temporaire disponible pour toutes les sessions et tous les utilisateurs.

Quelques lectures supplémentaires :

  • La bonne réponse de Martin Smith sur dba.stackexchange.com

  • FAQ MSDN sur la différence entre les deux :https://support.microsoft.com/en-gb/kb/305977

  • Article de blog MDSN :https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table

  • Article :https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables

  • Comportements inattendus et implications sur les performances des tables temporaires et des variables temporaires :Paul White sur SQLblog.com