2009-01-14 3 views
2

Voici mon scénario:MS-SQL 2000: Désactiver la journalisation lors de la procédure stockée

J'ai une procédure stockée simple qui supprime un ensemble spécifique de lignes d'une table (on va dire au sujet de 30k lignes), puis insère environ la même quantité de lignes. Cela ne devrait généralement prendre que quelques secondes; Cependant, la table comporte un déclencheur qui surveille les insertions/suppressions et essaie d'imiter ce qui est arrivé à une table liée sur un autre serveur.

Ce processus est lent à cause du déclencheur, et la table est également verrouillée pendant ce processus. Voici donc mes deux questions:

  1. Je suppose qu'une partie décente du ralentissement est due au journal des transactions. Est-il possible pour moi de spécifier dans ma procédure stockée que je ne veux pas que ce qui est dans la procédure soit enregistré?
  2. Y a-t-il un moyen pour moi de faire mes commandes 'DELETE FROM' et 'INSERT INTO' sans que je verrouille la table pendant tout le processus?

Merci!

- Merci pour les réponses; Je pensais que c'était le cas (ne pas être en mesure de faire l'un ou l'autre de ce qui précède), mais je voulais être sûr. Le déclencheur a été créé il y a longtemps et n'a pas l'air très efficace. Il semble donc que ma prochaine étape consistera à trouver ce qui est nécessaire et comment il peut être amélioré. Merci!

Répondre

2

1) non, vous faites pas non plus une opération journalisée comme TRUNCATE ou INSERT

2 VRAC) Non, comment voulez-vous empêcher la corruption autrement?

1

Je ne supposerais pas automatiquement que le problème de performance est dû à la journalisation. En fait, il est probable que le déclencheur soit écrit de manière à causer des problèmes de performance. Je vous encourage à modifier votre question initiale et montrer le code pour le déclencheur.

1

Vous ne pouvez pas désactiver l'intégrité transactionnelle lors de la modification des données. Vous pouvez ignorer les verrous lorsque vous sélectionnez des données à l'aide de select * du tableau (nolock); Cependant, vous devez être très prudent et vous assurer que votre application peut gérer les lectures incorrectes.

1

Cela n'aide pas votre déclencheur, mais la solution au problème de verrouillage consiste à effectuer les transactions en lots plus petits.

Au lieu de

DELETE FROM Table WHERE <Condition> 

faire quelque chose comme

WHILE EXISTS (SELECT * FROM table WHERE <condition to delete>) 
BEGIN 
    SET ROWCOUNT 1000 
    DELETE FROM Table WHERE <Condition> 
    SET ROWCOUNT 0 
END 
1

Vous pouvez désactiver temporairement le déclencheur, exécutez votre proc, puis faire ce que le déclencheur a été fait d'une manière plus efficace.

-- disable trigger 
ALTER TABLE [Table] DISABLE TRIGGER [Trigger] 
GO 

-- execute your proc 
EXEC spProc 
GO 

-- do more stuff to clean up/sync with other server 
GO 

-- enable trigger 
ALTER TABLE [Table] ENABLE TRIGGER [Trigger] 
GO 
Questions connexes