Адаптивното буфериране е добър отговор. Бих препоръчал също да проверите SET
на връзките опции чрез SQL Server Profiler.
Когато стартирате проследяване, уверете се, че ExistingConnections
е избран. Сравнете SPID от JDBC връзка и SSMS връзка. ARITHABORT
идва на ум като такъв, който видях да причинява разлика в производителността между SSMS и JDBC драйвер. Microsoft го споменава накратко тук:http://msdn.microsoft.com/en-us/library/ms190306.aspx. Информация за Stack Exchange тук:https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query
В Oracle видях огромно въздействие, като играя с setFetchSize
метод на Statement
/ PreparedStatement
обект. Очевидно драйверът на SQL Server не поддържа този метод. Въпреки това, има вътрешен метод в драйвера за това. Вижте Задаване на предварително извличане на ред по подразбиране в SQL Server с помощта на JDBC драйвер за подробности.
Също така, какво правите във вашия while (rs.next())
цикъл? Опитайте да не правите нищо друго, освен да четете колона, като rs.getInt(1)
. Вижте какво се случва. Ако лети, това предполага, че тесното място е в предишната ви обработка на набора от резултати. Ако все още е бавен, проблемът трябва да е в драйвера или базата данни.
Можете да използвате SQL Server Profiler, за да сравните изпълненията, когато идват чрез JDBC и докато го изпълнявате чрез SSMS. Сравнете CPU, четене, запис и продължителност. Ако са различни, тогава планът за изпълнение вероятно е различен, което ме насочва към първото нещо, което споменах:SET
опции.