oracle execute慢,使用preparedStatement缓慢查询但不使用executeQuery

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

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

先谢谢你了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值