2009-04-27 2 views
2

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

Répondre

1

Avez-vous fait un diff sur les schémas pour la version 2000 par rapport à la version 2005.

Si la version 2005 numérise au lieu de chercher, il semble que vous pourriez manquer un index sur une des colonnes de menuisier qui est utilisé pour créer votre point de vue

+0

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. –

2

Pour résoudre votre problème immédiat, nous avons eu un problème similaire dans SQL 2000 il y a quelque temps avec un curseur utilisant une source de données qui a elle-même été modifiée pendant la boucle du curseur (dans ce cas, vous sélectionnez V et aussi la mise à jour V). De mémoire (et il serait bon d'avoir une confirmation à ce sujet) la source de données pour le curseur a été soit mis à jour ou régénéré afin de garder la source de données à jour avec les changements effectués.

Notre résolution était d'abord de sélectionner vos données dans une table temporaire ou une variable de table, et d'utiliser cela comme source pour votre curseur. Bien sûr, vous devrez modifier votre code SQL pour mettre à jour en utilisant un identifiant ou un autre identifiant unique, mais je suppose que vous avez ces contraintes dans le système.

Bien sûr, il semble qu'il y ait un peu de place pour l'optimisation en général avec votre solution, les curseurs par exemple ne sont généralement pas l'approche préférée - mais vous trouverez peut-être un niveau de performance acceptable, moins pour le moment.

+0

Bonjour Chris thanx pour répondre, mais ce lot j'ai résolu à partir du profileur tout en profilant un outil tiers. Donc, je ne peux rien changer dans le lot. Je n'aurais pas utilisé cette solution bien sûr :-) –

+0

si vous ne pouvez pas changer le code comment diable pouvez-vous résoudre ce problème? –

+0

La question est plutôt de savoir pourquoi l'année 2005 a-t-elle été si mauvaise par rapport à 2000? –

Questions connexes