J'ai vue V
dans la base de données D1
sur laquelle un déclencheur de mise à jour U
est définie qui met à jour trois tables T1
, T2
et T3
dans la base de données D2
. Ces trois tables contiennent 0,75, 6.0 & 4,5 millions d'enregistrements. La version de Sql Server est 9.0.3042, Developer Edition.problème de performance lors de mise à jour en vue (à l'aide d'un lieu de détente) par l'intermédiaire d'un curseur dans Sql Server 2005
Lorsque j'effectue la déclaration de mise à jour suivante sur la vue ci-dessus, il est prêt à moins d'une seconde:
UPDATE V
SET cust_task_id = 11975628
WHERE custno = '0319607'
Cependant quand je lance le lot suivant, il prend une minute et 12 secondes pour terminer:
DECLARE CURSOR c
FOR SELECT custno, cust_task_id FROM V WHERE custno = '0319607'
FOR UPDATE OF cust_task_id
OPEN c
FETCH NEXT FROM c
UPDATE V
SET cust_task_id = 11975628
WHERE CURRENT OF c
CLOSE c
DEALLOCATE c
Lorsque j'utilise les mêmes bases de données (en ce qui concerne la définition et le nombre d'enregistrements) et les mêmes instructions de mise à jour sur la version 2000 de Sql Server (8.0.2039, Standard Edition)
Quand vous regardez les plans d'interrogation des lots de curseur sur les deux versions de SQL Server, vous voyez que le plan 2005 utilise des analyses d'index sur les tables T1
, T2
et T3
alors que le plan 2000 utilise l'indice cherche. Cela explique donc la différence de performance.
J'ai essayé sp_updatestats
sur les bases de données 2005, mais cela n'a pas aidé.
Quelqu'un at-il une idée de comment je peux obtenir le lot de curseur 2005 pour effectuer comment il devrait?
Merci d'avance de prendre le temps d'examiner cette question.
Salutations,
Lex Verbeek
Bonjour Ecrivez-nous pour répondre, mais la définition des deux bases de données est la même. Donc, pas d'index manquant. –