( 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
vsdirect
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
vsdirect
? 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 !