使用preparedStatement缓慢查询但不使用executeQuery

时间:2017-11-26 19:26:46

标签: java sql-server jdbc

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在我这边没有收到数据。

我无法找到为什么会这样,所以任何想法都会受到欢迎。

先谢谢你了!

1 个答案:

答案 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的建议!