Den adaptiva buffringen är ett bra svar. Jag skulle också rekommendera att kontrollera anslutningarnas SET
alternativ via SQL Server Profiler.
När du startar en spårning, se till att ExistingConnections
är vald. Jämför ett SPID från en JDBC-anslutning och en SSMS-anslutning. ARITHABORT
kommer att tänka på som en som jag har sett orsaka en skillnad i prestanda mellan SSMS och JDBC-drivrutin. Microsoft nämner det kort här:http://msdn.microsoft.com/en-us/library/ms190306.aspx. Stack Exchange-information här:https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query
På Oracle har jag sett enorma effekter genom att spela med setFetchSize
metod på Statement
/ PreparedStatement
objekt. Uppenbarligen stöder inte SQL Server-drivrutinen den metoden. Det finns dock en intern metod i drivrutinen för det. Se Ange en standardradförhämtning i SQL Server med JDBC-drivrutinen för mer information.
Dessutom, vad gör du i din while (rs.next())
slinga? Försök inte göra något annat än att läsa en kolumn, som rs.getInt(1)
. Se vad som händer. Om det flyger tyder det på att flaskhalsen ligger i din tidigare bearbetning av resultatuppsättningen. Om det fortfarande är långsamt måste problemet finnas i drivrutinen eller databasen.
Du kan använda SQL Server Profiler för att jämföra körningarna när de kommer in via JDBC och när du kör den via SSMS. Jämför CPU, läsning, skrivning och varaktighet. Om de är olika så är exekveringsplanen förmodligen annorlunda, vilket pekar mig tillbaka till det första jag nämnde:SET
alternativ.