web-dev-qa-db-fra.com

Supprimez explicitement la table temporaire ou laissez SQL Server la gérer

Quelle est la meilleure pratique pour gérer la suppression d'une table temporaire. J'ai lu que vous devez explicitement gérer la goutte et également que le serveur SQL doit gérer la goutte .... quelle est la bonne méthode? J'ai toujours eu l'impression que vous deviez faire votre propre nettoyage des tables temporaires que vous créez dans un sproc, etc. Mais j'ai trouvé d'autres bits qui suggèrent le contraire.

Toute idée serait grandement apprécié. Je crains juste de ne pas suivre les meilleures pratiques avec les tables temporaires que je crée.

Merci,

S

47
scarpacci

À mon avis, voyez d'abord si vous avez vraiment besoin d'une table temporaire - ou - pouvez-vous vous contenter d'un CTE. Deuxièmement, je supprimais toujours mes tables temporaires. Parfois, vous devez avoir une table temporaire étendue à la connexion (par exemple, ## temp), donc si vous exécutez la requête une deuxième fois et que vous avez un code explicite pour créer la table temporaire, vous obtiendrez une erreur indiquant la table existe déjà. Le nettoyage après vous-même est TOUJOURS une bonne pratique logicielle.

26
HardCode

Les tables temporaires locales (# unique dans le nom) seront automatiquement supprimées lorsqu'elles sont hors de portée, donc la suppression explicite n'a aucun sens si la portée est de courte durée (une procédure stockée par exemple).

8
Vedran

Dans un scénario à plusieurs threads où chaque thread crée son propre ensemble de tables et le nombre de threads est limité, ne pas supprimer vos propres tables signifie que le gouverneur considérera votre thread comme terminé et générera plus de threads ... mais les tables temporaires sont toujours autour (et donc les connexions au serveur) ainsi vous dépasserez les limites de votre gouverneur. si vous supprimez manuellement les tables temporaires, le thread ne se termine pas tant qu'il n'a pas été supprimé et qu'aucun nouveau thread n'est généré, ce qui permet au gouverneur de ne pas écraser le moteur SQL.

2
ekkis

J'ai l'habitude de tomber dans la foule de laisser les objets être nettoyés par les processus du serveur d'arrière-plan, cependant, récemment, avoir des problèmes avec la croissance extrême du fichier journal TempDB a changé mon opinion. Je ne sais pas si cela a toujours été le cas avec chaque version de SQL Server, mais depuis le passage à SQL 2016 et la mise des disques sur une matrice SSD PureStorage, les choses fonctionnent un peu différemment. Les processus sont généralement liés au processeur plutôt qu'aux E/S, et la suppression explicite des objets temporaires n'entraîne aucun problème de croissance des journaux. Bien que je n'aie pas trop exploré pourquoi, je soupçonne que ce n'est pas différent de la collecte des ordures dans le monde .NET où il est synchrone lorsqu'il est appelé explicitement et asynchrone lorsqu'il est laissé au système. Cela importerait car la suppression explicite libérerait le stockage dans le fichier journal et le rendrait disponible lors de la prochaine sauvegarde du journal, alors que cela ne semble pas être le cas lorsque vous ne supprimez pas explicitement l'objet. Sur la plupart des systèmes, ce n'est probablement pas un gros problème, mais sur un système prenant en charge un volume élevé ERP et une vitrine Web avec de nombreuses transactions simultanées et une utilisation intensive de TempDB, cela a eu un grand impact. pour savoir pourquoi créer les objets TempDB en premier lieu, avec la quantité de données dans la plupart des requêtes, cela déborderait de toute façon dans le stockage TempDB, il est donc généralement plus efficace de créer l'objet avec les index nécessaires plutôt que de laisser le système gérer automatiquement.

2
Joshua Perry

Selon mon point de vue. Pas besoin de supprimer explicitement les tables temporaires. Le serveur SQL va gérer pour supprimer les tables temporaires stockées dans temp db en cas de stockage d'espace pour traiter la requête.

0
Gunarathinam