当前位置: 首页 > 知识库问答 >
问题:

使用预准备语句的慢查询,但不具有执行查询的查询速度

乔凯康
2023-03-14

我在Grails应用程序访问数据时遇到了一个奇怪的问题。更深入地讲,我使用PreparedStatement将问题隔离到一个普通的java8小型应用程序。executeQuery与Statement.executeQuery。

考虑以下代码片段:

                  
    // 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();

相同的查询。

数据来自 SqlServer 上的一个视图(我认为是 2008 年,现在无法访问),该视图来自一个记录超过 1500 万条的表。所有需要的字段都有索引,从控制台执行的相同查询(第一个查询)的运行速度也相当快。

如果我在没有ORDER子句的情况下执行缓慢的PreparedStatement查询,它也会运行得很快。

在我看来,很明显,无论出于什么原因,数据库都没有使用索引,并在使用准备语句时进行全面扫描,但也许我错了,所以我对任何想法都持开放态度。

我想也许驱动程序(sqlserver官方最新和jtds已经过测试)正在保存数据等待任何类型的EOF从连接,但我已经检查了我这边的tcpdump,没有收到任何数据。

我不知道为什么会发生这种情况,所以任何想法都会受到欢迎。

先进谢谢!

共有1个答案

莘翰采
2023-03-14

我终于找到了解决办法,至少对我来说是这样。我在这里找到了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的建议!

 类似资料: