2009-05-10 8 views
4

Est-il possible d'avoir une table temporaire 'persistante' dans MS-SQL? Ce que je veux dire, c'est que j'ai actuellement une tâche de fond qui génère une table temporaire globale, qui est utilisée par une variété d'autres tâches (c'est pourquoi je l'ai rendu global). Malheureusement, si la table est inutilisée, elle est automatiquement supprimée par SQL - ceci est gracieusement géré par mon système, car il est juste mis en file d'attente pour être reconstruit à nouveau, mais idéalement je voudrais qu'il soit construit une fois par jour. Donc, idéalement, je pourrais juste définir quelque chose comme définir un paramètre de délai, comme "Si rien ne touche à cela pendant 1 heure, puis supprimer". Je ne le veux vraiment pas dans ma base de données existante car cela me causerait plus de maux de tête liés à la gestion de la base de données (fragmentation, croissance du journal, etc.), car ce sont des données cumulables, utiles seulement pour une période de 24 heures. et prend plus d'un gigaoctet d'espace HD.Tables temporaires persistantes dans SQL?

Dans le pire des cas mon plan est de créer une autre base de données sur le même disque que tempdb, l'appeler quelque chose comme PseudoTempDB, et gérer simplement la chute moi-même.

Toute idée serait grandement appréciée!

+1

Optez pour le plan B, gérez vous-même la durée de vie, il n'existe aucun support pour ce que vous demandez dans SQL Server uniquement. –

+0

J'ai trouvé ce poste qui pourrait être utile: http://stackoverflow.com/questions/27835/does-ms-sql-support-in-memory-tables – Kekoa

+0

kekoav, je crois savoir que les variables de table fonctionnent à peu près comme la température tables (en termes de persistance). Donc, mon hypothèse est que la variable de table disparaîtrait juste une fois que j'aurais cessé d'y accéder (tout comme la table temporaire). – Mark

Répondre

3

Je voudrais aller avec votre plan B, "créer une autre base de données sur le même lecteur que tempdb, l'appeler quelque chose comme PseudoTempDB, et gérer simplement l'abandon moi-même."

2

Je dois avouer que je fais une double prise sur cette question: "persistante" et "temp" ne vont généralement pas ensemble! Que diriez-vous d'un peu de réflexion hors de la boîte? Peut-être que votre tâche d'arrière-plan pourrait périodiquement exécuter une requête triviale pour empêcher SQL de marquer la table comme inutilisée. De cette façon, vous auriez un contrôle direct sur la création et le démontage.

+0

Oui, un peu d'une dichotomie - je veux juste une plus grande fenêtre pour mes données 'temp'. :) Vous n'avez même pas besoin d'exécuter une requête en arrière-plan, tant que vous avez une connexion ouverte qui a exécuté une requête une fois, elle restera. En tant que hack, c'est ce que je fais actuellement, mais si la connexion est abandonnée pour une raison quelconque, alors il faut tout reconstruire, donc ce n'est pas une solution aussi propre que mon plan B. – Mark

+0

Tout ce qui fonctionne ... bonne chance et merci pour l'upvote. –

+0

Ce serait une chose assez facile à faire. Si la table temporaire ne contient pas trop de lignes, un compte select (*) de foo le ferait. –

1

Que diriez-vous de créer une table permanente? Dites, MyTable. Une fois toutes les 24 heures, le rafraîchissement des données comme ceci:

  1. Créer une nouvelle table MyTableNew et le remplir
  2. Dans une transaction, laissez tomber MyTable, et l'utilisation rename_object renommer MyTableNew MYTABLE

Cette Ainsi, vous recréerez la table tous les jours.

Si vous êtes préoccupé par les fichiers journaux, stockez la table dans une base de données différente et définissez-la sur Modèle de récupération: Simple.

+0

C'est essentiellement ce que j'ai décrit ci-dessus - la seule différence est que vous proposez de le faire dans la même base de données. Je pourrais certainement le mettre dans la même base de données, mais comme ce n'est pas utile à long terme, je ne le veux pas dans les sauvegardes pour la base de données (et je ne veux pas commencer à compliquer les choses avec des exclusions). – Mark

4

Si vous créez une table tempdb.dbo.TempTable, il ne sera pas abandonné jusqu'à ce que:

un - SQL Server est redémarré

b - Vous déposez explicitement

Si vous Si vous souhaitez qu'il soit toujours disponible, vous pouvez créer cette table dans le modèle, afin qu'elle soit copiée dans tempdb lors du redémarrage (mais elle sera également créée sur toute nouvelle base de données créée ultérieurement, vous devrez donc la supprimer manuellement) ou utilisez une procédure stockée de démarrage pour la créer. Cependant, il n'y aurait aucun moyen de conserver les données via des redémarrages.

+2

Intéressant, donc si vous le créez en utilisant TempDB comme base de données au lieu de préfixer le # ou le ##, alors il devient effectivement perméable jusqu'au redémarrage (quand tempdb est quand même sauvegardé)? C'est exactement ce que je cherche - je peux gérer le recréer s'il n'existe pas. – Mark

+1

Oui, c'est comme ça que ça fonctionne. J'ai été heureux d'être utile – LeoPasta

+2

@Mark, pouvez-vous s'il vous plaît confirmer que tout ce que disait LeoPasta est vrai ou non? – peakit

Questions connexes