Grails应用程序访问数据时遇到了一个奇怪的问题。更深入的我使用PreparedStatement.executeQuery vs Statement.executeQuery将问题分离到一个普通的java8小应用程序。
考虑以下代码片段:
// executes in milliseconds
directSql = "select top(10) * from vdocuments where codcli = 'CCCC' and serial = 'SSSS' ORDER BY otherField DESC;";
stmt = con.createStatement();
rs = stmt.executeQuery(directSql);
// More than 10 minutes
sqlPrepared = "select top(10) * from vdocuments where codCli = ? and serial = ? ORDER BY otherField DESC;";
PreparedStatement pStatement = con.prepareStatement( sqlPrepared );
pStatement.setString(1, "CCCC");
pStatement.setString(2, "SSSS");
rsPrepared = pStatement.executeQuery();
相同的查询。
数据来自一个有超过1500万条记录的SqlServer(2008年,我认为现在无法访问)的视图。所有需要的字段都有索引,并且从控制台运行执行的相同查询(第一个)也非常快。
如果我在没有ORDER子句的情况下执行慢速PreparedStatement查询,它也会快速运行。
我很清楚,对于任何原因,数据库在使用preparedStatement时没有使用索引并进行完整扫描,但也许我错了所以我对任何想法持开放态度。
我想也许驱动程序(sqlserver官方最新和jtds已经过测试)持有数据等待任何类型的EOF连接但我已经检查了tcpdump在我这边没有收到数据。
我无法找到为什么会这样,所以任何想法都会受到欢迎。
先谢谢你了!
答案 0 :(得分:1)
我终于找到了一个解决方案,至少在我的情况下。我在这里得到它http://mehmoodbluffs.blogspot.com.es/2015/03/hibernate-queries-are-slow-sql-servers.html。告诉(驱动程序?sqlServer?)不发送参数,因为Unicode已经解决了问题。
现在的当前连接字符串:
String connectionUrl = "jdbc:sqlserver://server:port;databaseName=myDataBase;sendStringParametersAsUnicode=false";
现在,直接查询和preparedStatements都以毫秒的速度运行。
感谢@DanGuzman的建议!