Tuve un problema similar, con una solicitud muy simple (SELECT . FROM . WHERE =.) que tardaba hasta 10 segundos en devolver una sola fila cuando usaba una conexión jdbc en Java, mientras que tomaba solo 0.01 s en sqlshell. El problema era el mismo si usaba el controlador MS SQL oficial o el controlador JTDS.
La solución fue configurar esta propiedad en la URL de jdbc:sendStringParametersAsUnicode=false
Ejemplo completo si está utilizando el controlador oficial de MS SQL:jdbc:sqlserver://yourserver;instanceName=yourInstance;databaseName=yourDBName;sendStringParametersAsUnicode=false;
Instrucciones si usa diferentes controladores jdbc e información más detallada sobre el problema aquí:http://emransharif.blogspot.fr/2011/07/problemas-de-rendimiento-con-controladores-jdbc.html
En mi caso, tenía más de 30 millones de registros en la tabla desde la que estaba buscando. La duración para completar la solicitud pasó de más de 10 segundos a aproximadamente 0,01 s después de aplicar la propiedad.
¡Espero que esto ayude a alguien!