gpt4 book ai didi

java - 使用 preparedStatement 查询速度慢,但使用 executeQuery 查询速度慢

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:38 27 4
gpt4 key购买 nike

我在 Grails 应用程序访问数据时遇到了一个奇怪的问题。更深入地说,我已经将问题隔离到使用 PreparedStatement.executeQuery 与 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 View (我认为是 2008 年,现在无法访问)。所有需要的字段都有索引,从控制台运行的相同查询(第一个)也非常快。

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

在我看来很清楚,无论出于何种原因,数据库在使用 preparedStatement 时都没有使用索引并进行全面扫描,但也许我错了,所以我愿意接受任何想法。

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

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

先谢谢你!

最佳答案

我终于找到了解决方案,至少对我而言是这样。我在这里找到了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 的建议!

关于java - 使用 preparedStatement 查询速度慢,但使用 executeQuery 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com