3 votes

Impact sur les performances de SQL 2000 de JDBC selectMethod=cursor

( Publié d'abord sur SO mais il n'obtient aucune réponse. Postage croisé pour atteindre un public plus large, puisqu'il s'agit d'un sujet interdisciplinaire).

En essayant d'aider une équipe de développement d'applications à résoudre certains problèmes de performance sur un serveur SQL 2000, j'ai lancé une trace SQL et découvert que tous les appels à la base de données sont remplis d'instructions API Server Cursor (sp_cursorprepexec, sp_cursorfetch, sp_cursorclose).

Il semble qu'ils spécifient certaines propriétés de la chaîne de connexion qui forcent l'utilisation de curseurs côté serveur, ne récupérant que 128 lignes de données à la fois : (From http://msdn.microsoft.com/en-us/library/Aa172588 )

Lorsque les attributs du curseur de l'API ou propriétés de l'API sont définis que leurs valeurs par défaut, le fournisseur OLE DB pour SQL Server et le pilote ODBC de SQL Server ODBC utilisent les curseurs du serveur API au lieu des ensembles de résultats par par défaut. Chaque appel à une fonction API qui récupère des lignes génère un aller-retour vers le serveur afin de récupérer les les lignes à partir du curseur du serveur API.

アップデイト : Ils ont plusieurs applications Java qui utilisent une connexion JDBC au serveur SQL avec selectMethod=cursor spécifié (par opposition à selectMethod=direct ).

De mon point de vue de DBA, c'est tout simplement ennuyeux (cela encombre la trace avec des déchets inutiles) et, selon toute probabilité, cela entraîne de nombreux allers-retours supplémentaires entre l'application et le serveur SQL, ce qui réduit les performances globales.

Ils ont apparemment testé selectMethod=direct de manière très limitée (une seule application sur 60) et a rencontré quelques problèmes (dont je n'ai pas les détails techniques).

Donc, mes questions sont :

  • Quel est l'impact sur les performances de selectMethod=cursor vs direct sur un serveur SQL 2000 déjà occupé ? (J'avais supposé que l'augmentation du nombre d'allers-retours entre les serveurs SQL et APP ne pouvait rien apporter de bon. Avais-je tort ?)
  • Est selectMethod un paramètre transparent à l'application ? Cela pourrait-il casser leurs applications si nous le modifions ?
  • Quand doivent-ils utiliser cursor vs direct ? Y a-t-il des types d'applications qui bénéficieraient de l'un plutôt que de l'autre ?

Mise à jour : J'ai découvert le nom du paramètre du conducteur, ce qui a justifié des modifications importantes du titre, du corps et des balises.

Mise à jour : Prime ajoutée. J'ai également ajouté une prime à la question SO (qui est plus axée sur le comportement de l'application). Merci !

3voto

vladr Points 313

En bref,

  1. selectMethod=cursor
    • en théorie, il faut plus de ressources côté serveur que selectMethod=direct
    • ne charge qu'au maximum taille du lot dans la mémoire du client en une seule fois, ce qui se traduit par une empreinte mémoire plus prévisible pour le client.
  2. selectMethod=direct
    • nécessite théoriquement moins de ressources côté serveur que selectMethod=cursor
    • lira l'ensemble des résultats dans la mémoire du client (à moins que le pilote ne prenne en charge de manière native la récupération asynchrone des ensembles de résultats) avant que l'application cliente ne puisse itérer sur ces résultats. peut réduire les performances de deux manières :
      1. performances réduites avec de grands ensembles de résultats si l'application client est écrite de manière à arrêter le traitement après avoir parcouru seulement une fraction de l'ensemble de résultats (avec l'option direct il a déjà payé le coût de la récupération de données qu'il va essentiellement jeter ; avec cursor les déchets sont limités à un maximum de taille du lot - 1 lignes -- la condition de fin anticipée devrait probablement être recodée en SQL de toute façon, par exemple sous la forme suivante SELECT TOP ou des fonctions de fenêtre)
      2. des performances réduites pour les grands ensembles de résultats en raison de problèmes potentiels de collecte de déchets et/ou de sortie de mémoire associés à une empreinte mémoire accrue

En résumé,

  • Peut-on utiliser selectMethod=cursor une baisse des performances des applications ? -- l'une ou l'autre méthode peut réduire les performances, pour des raisons différentes. Au-delà d'une certaine taille de jeu de résultats, cursor peut encore être préférable. Voir ci-dessous pour savoir quand utiliser l'un ou l'autre.
  • Est selectMethod= un paramètre transparent pour l'application sur une connexion JDBC ? -- c'est transparent, mais cela peut quand même casser leur application si l'utilisation de la mémoire augmente suffisamment pour accaparer leur système client (et, par conséquent, votre serveur) ou faire planter le client tout entier
  • Plus généralement, quand faut-il utiliser cursor vs direct ? -- J'utilise personnellement cursor lorsqu'il s'agit d'ensembles de résultats potentiellement grands ou autrement non limités. Les frais d'aller-retour sont alors amortis si la taille du lot est suffisamment grande, et l'empreinte mémoire de mon client est prévisible. J'utilise direct quand la taille de l'ensemble de résultats que j'attends est connue pour être inférieure à la taille du lot que j'utilise avec cursor ou liés d'une manière ou d'une autre, ou lorsque la mémoire n'est pas un problème.

Santé, V.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X