Adaptivní vyrovnávací paměť je dobrá odpověď. Také bych doporučil zkontrolovat SET
připojení možnosti prostřednictvím SQL Server Profiler.
Když zahájíte trasování, ujistěte se, že ExistingConnections
je vybráno. Porovnejte SPID z připojení JDBC a připojení SSMS. ARITHABORT
přichází na mysl jako jeden, který jsem viděl způsobit rozdíl ve výkonu mezi ovladačem SSMS a JDBC. Microsoft to krátce zmiňuje zde:http://msdn.microsoft.com/en-us/library/ms190306.aspx. Informace o Stack Exchange zde:https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query
Na Oracle jsem viděl obrovský dopad hraním s setFetchSize
metoda na Statement
/ PreparedStatement
objekt. Ovladač SQL Server zjevně nepodporuje tuto metodu. V ovladači na to však existuje interní metoda. Podrobnosti najdete v části Nastavení výchozího přednačítání řádků v SQL Server pomocí ovladače JDBC.
Také, co děláte ve svém while (rs.next())
smyčka? Zkuste nedělat nic jiného, než číst sloupec, například rs.getInt(1)
. Podívejte se, co se stane. Pokud letí, znamená to, že úzké místo je ve vašem předchozím zpracování sady výsledků. Pokud je stále pomalý, problém musí být v ovladači nebo databázi.
Můžete použít SQL Server Profiler k porovnání spouštění tak, jak přicházejí přes JDBC a jak jej spouštíte přes SSMS. Porovnejte CPU, čtení, zápis a dobu trvání. Pokud se liší, pak je plán provádění pravděpodobně odlišný, což mě ukazuje zpět na první věc, kterou jsem zmínil:SET
možnosti.