Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi la requête Microsoft SQL Server 2012 prend-elle quelques minutes sur JDBC 4.0 mais une ou plusieurs secondes dans Management Studio ?

La mise en mémoire tampon adaptative est une bonne réponse. Je recommanderais également de vérifier les connexions SET options via SQL Server Profiler.

Lorsque vous démarrez une trace, assurez-vous que ExistingConnections est sélectionné. Comparez un SPID d'une connexion JDBC et d'une connexion SSMS. ARITHABORT vient à l'esprit comme celui que j'ai vu causer une différence de performances entre SSMS et le pilote JDBC. Microsoft le mentionne brièvement ici :http://msdn.microsoft.com/en-us/library/ms190306.aspx. Informations sur Stack Exchange ici :https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query

Sur Oracle, j'ai vu d'énormes impacts en jouant avec le setFetchSize méthode sur la Statement / PreparedStatement objet. Apparemment, le pilote SQL Server ne prend pas en charge cette méthode. Cependant, il existe une méthode interne dans le pilote pour cela. Voir Définir une prélecture de ligne par défaut dans SQL Server à l'aide du pilote JDBC pour plus de détails.

Aussi, que faites-vous dans votre while (rs.next()) boucle? Essayez de ne rien faire d'autre que de lire une colonne, comme rs.getInt(1) . Voyez ce qui se passe. S'il vole, cela suggère que le goulot d'étranglement se trouve dans votre ancien traitement de l'ensemble de résultats. S'il est toujours lent, le problème doit provenir du pilote ou de la base de données.

Vous pouvez utiliser SQL Server Profiler pour comparer les exécutions au fur et à mesure qu'elles arrivent via JDBC et lorsque vous l'exécutez via SSMS. Comparez le CPU, les lectures, les écritures et la durée. S'ils sont différents, alors le plan d'exécution est probablement différent, ce qui me ramène à la première chose que j'ai mentionnée :le SET options.