Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用preparedStatement但不使用executeQuery进行慢速查询_Java_Sql Server_Jdbc - Fatal编程技术网

Java 使用preparedStatement但不使用executeQuery进行慢速查询

Java 使用preparedStatement但不使用executeQuery进行慢速查询,java,sql-server,jdbc,Java,Sql Server,Jdbc,我在Grails应用程序访问数据时遇到了一个奇怪的问题。更深入地讲,我使用PreparedStatement.executeQuery与Statement.executeQuery将问题隔离到一个普通的java8小型应用程序 考虑以下代码片段: // executes in milliseconds directSql = "select top(10) * from vdocuments where

我在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();

同样的问题

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

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

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

我想可能是驱动程序(sqlserver官方最新版本,jtds已经过测试)在等待连接的任何类型的EOF时保存了数据,但我已经与我这边的tcpdump进行了检查,没有收到任何数据

我不知道为什么会这样,所以任何想法都会受到欢迎


提前谢谢你

我终于找到了解决办法,至少在我的案例中是这样。我在这儿买的。告诉(驱动程序?sqlServer?)不要以Unicode格式发送参数解决了问题

当前连接字符串现在是:

 String connectionUrl = "jdbc:sqlserver://server:port;databaseName=myDataBase;sendStringParametersAsUnicode=false";
现在直接查询和preparedStatements都以毫秒的速度运行


谢谢@DanGuzman的建议

对于性能问题,我建议的第一件事是审查执行计划。我将尝试一下,但是,为什么在这两种情况下应该有所不同呢?。最糟糕的是,我如何做一份准备好的声明?。我无法从java执行解释计划…\据我所知。非常感谢。由于数据类型不匹配或参数嗅探,计划可能不同。执行计划将揭示这一点,但一个常见问题是Unicode字符串参数与varchar列相比较,这会妨碍索引的有效使用。或者,这可能是由于参数嗅探,其中重用了缓存的计划,但对于当前参数值而言,这是次优的。您需要DBA帮助获取计划。他们应该能够从数据库服务器上的查询缓存中提取这些内容。如果你有一个开发/测试环境,在这个环境中你有权自己进行开发/测试,运行跟踪等。当你得到计划时,上传到并添加问题的链接。谢谢@danguzman的建议(以及我不知道的页面)。我和一些有经验的数据库人员(不是我们团队中真正的DBA,也不是客户)一起研究数据库计划,很明显,在某些情况下,SQL使用的索引与计划中预期的不同。我们无法找到原因,需要更深入的了解,但看起来这可能是解决我们问题的更精确方法:非常感谢!