我在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,没有收到任何数据。
我不知道为什么会发生这种情况,所以任何想法都会受到欢迎。
先进谢谢!
我终于找到了解决办法,至少对我来说是这样。我在这里找到了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的建议!
我有一个搜索查询,它必须使用包含搜索搜索表中的一列。列上有CTXSYS.Context类型索引。当使用prepared语句在表中获取数据时,搜索查询不能处理像-、/、_等特殊字符。
我犯了什么错?
问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。
使用Chris Brand的答案-它把我带到绑定参数并停在那里... 用阿卜杜拉的回答: