Exécution planifiée du code pour effectuer des opérations de database dans SQL Server

Si je veux effectuer certaines opérations de database sur une base régulière, je pourrais:

Deux questions:

  1. Quels sont les autres moyens d'accomplir cette
  2. Quels critères de décision doit-on utiliser pour décider de la meilleure approche?

Je vous remercie.

Je pense que la meilleure approche pour les critères de décision est ce qu'est le travail. Si c'est une tâche SQL Server complètement interne ou un set de tâches qui ne se rapportent pas au monde extérieur, je dirais qu'un travail SQL est le meilleur pari. Si d'un autre côté, vous récupérez des données et que vous faites quelque chose avec SQL Server, ce qui est très difficile en T-SQL ou prend du time, le service externe est peut-être le meilleur choix.

Une autre possibilité est d'avoir une queue de tâches quelque part, et lorsque des applications qui utilisent la database exécutent une opération, elles font également certaines tâches hors de la queue. Wikipedia fait quelque chose comme ça avec sa queue. La planification n'est pas aussi sûre qu'avec les autres methods, mais vous pouvez par exemple vous empêcher de faire le ménage lorsque votre server est lourdement chargé.

Edit: Ce n'est pas forcément meilleur ou pire que les autres techniques. Il convient aux tâches qui ne doivent pas être exécutées à une date précise, mais qui doivent être effectuées «de time en time» ou «bientôt, mais pas nécessairement en ce moment».

Avantages

  • Vous n'avez pas besoin d'écrire une application distincte ou de configurer l'Agent SQL Server.
  • Vous pouvez utiliser n'importe quel critère que vous pouvez programmer pour décider d'exécuter ou non une tâche: immédiatement, une fois un certain time passé, ou seulement si le server n'est pas soumis à une charge importante.
  • Si les tâches planifiées sont similaires à l'optimization des index, vous pouvez les faire less fréquemment lorsqu'elles sont less nécessaires (par exemple lorsque les mises à jour sont rares), et plus fréquemment lorsque les mises à jour sont courantes.

Désavantages

  • Vous devrez peut-être modifier plusieurs applications pour coopérer correctement.
  • Vous devez vous assurer que la queue ne s'accumule pas trop.
  • Vous ne pouvez pas garantir de manière fiable qu'une tâche s'exécute avant un certain time.
  • Vous pouvez avoir de longues périodes pendant lesquelles vous ne recevez aucune request (par exemple la nuit) où des tâches différées / programmées peuvent être effectuées, mais ne le faites pas. Vous pouvez le combiner avec l'une des autres idées, en ayant un programme spécial qui fait juste les tâches dans la queue, mais vous ne pouvez pas du tout vous soucier de la queue.

Vous ne pouvez pas vraiment countr sur des process externes. Toutes les solutions 'OS' que j'ai vues n'ont pas marché dans le monde réel: une database va bien au-delà des données, principalement grâce à la stratégie de sauvegarde / restauration, la stratégie de haute disponibilité, la stratégie de reprise après sinistre et toutes les autres 'ities' vous payez dans votre licence SQL Server. Un programmateur basé sur OS sera un composant externe totalement inconscient et non embedded avec l'un d'entre eux. C'est à dire. vous ne pouvez pas sauvegarder / restaurer votre emploi du time avec vos données, il ne peut pas basculer avec votre database, vous ne pouvez pas l'envoyer à un site de récupération après sinistre distant via votre canal d'envoi de données SQL.

Si vous avez un agent (c'est-à-dire pas une édition Express), utilisez l'agent. A une longue histoire d'utilisation et le savoir-faire autour est important. Le seul problème avec Agent est sa dépendance à msdb qui le déconnecte de la database de l'application et ne fonctionne donc pas bien avec les solutions de disponibilité et de restauration basées sur la mise en miroir.

Pour les éditions Express (c'est-à-dire pas d'agent), la meilleure option consiste à lancer votre propre planificateur en fonction des temporisateurs de conversation (au less dans SQL 2k5 et forward). Vous utilisez des conversations pour vous envoyer des messages au moment voulu et vous appuyez sur des procédures activées pour exécuter les tâches. Ils sont transactionnels et embeddeds à votre database, vous pouvez donc vous y fier après une restauration et après un basculement en miroir ou en cluster. Malheureusement, le savoir-faire sur la façon de les utiliser est assez court, j'ai plusieurs articles sur le sujet sur mon site rusanu.com . J'ai vu des systèmes répliquant une bonne quantité d'API agent sur Express en se basant entièrement sur les minuteurs de conversation.

Je vais généralement avec la méthode de planification des systèmes d'exploitation (planificateur de tâches pour Windows, cron pour Unix).

Je gère plusieurs plates-forms de database (SQL Server, Oracle, Informix) et je souhaite que la planification des tâches rest la plus générique possible.

De plus, dans notre environnement de production, nous devons impliquer un DBA pour tout dépannage / redémarrage des travaux en cours dans la database. Nous avons un meilleur access aux servers d'applications avec les tâches planifiées sur eux.

J'irais avec SQL Server Agent. C'est bien embedded avec SQL Server; diverses fonctionnalités de SQL Server utilisent Agent (Log Shipping, par exemple). Vous pouvez créer un travail d'agent pour exécuter un ou plusieurs packages SSIS, par exemple.

Il est également embedded avec la notification de l'opérateur, et peut être scripté, ou bien exécuté via SMO.