mars
2012
Les curseurs font partie intégrante de la norme SQL. Ils sont utilisés dans les SGBDRs pour réaliser des traitements ligne par ligne. Le temps de traitement des transactions SQL utilisant des curseurs dépend du SGBDR, de la qualité/quantité des données traitées, de l’écriture de la transaction SQL contenant le curseur, ….
Un curseur utilisé et qui n’est pas fermé (ne se termine pas par CLOSE nomCurseur et DEALLOCATE nomCurseur) aura des incidences sur la performance du serveur de base de données.
=> Liste des curseurs ouverts pour toutes les sessions
,s.login_name
,s.host_name
,s.program_name
,c.creation_time
,c.name
,c.is_open
,c.is_close_on_commit
,c.worker_time
,c.dormant_duration
,t.text as sql_text
FROM sys.dm_exec_cursors(0)as c
INNER JOIN sys.dm_exec_sessions as s ON c.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(c.sql_handle) t
=> Pour fermer les curseurs : Solution brutale
KILL c.session_id
Exemple
——–
KILL 52
=> Pour fermer les curseurs : Solution durable
Ajouter CLOSE nomCurseur et DEALLOCATE nomCurseur dans les procédures concernées
L’option CURSOR_CLOSE_ON_COMMIT (pour la session ou pour la base de donnée) est sensée résoudre ce genre de problème selon les recommandations de la norme ISO, mais la réalité est tout autre.
——————–
Etienne ZINZINDOHOUE