2012-06-19 30 views
4

我尝试限制结果集的大小,而不必更改应用程序中的每条SQL语句(至少例如)。因此,将ROWNUM子句添加到每个查询不是一个选项。如何在Oracle中限制全局结果集(或按会话)?

我在寻找或多或少的一些全局参数,或至少一个会话参数(如SQLServer中的SET ROWCOUNT)。

该应用使用JDBC资源池连接到Oracle,因此我可以在SQL init JDBC池中设置会话范围参数。

回答

3

您是否尝试过使用Statement.setMaxRows method?这是一种标准的JDBC方法,在获取指定的最大数量后将静默地删除行。

但是,从性能的角度来看,通过实际修改发送到数据库的查询可能会更好。如果你按照@MK的建议,你会告诉优化器你只会获取N行。这有可能使优化器选择更有效的计划。

+0

对,这个问题是a)数据库仍然需要找到所有的行,它只是JDBC,它会丢弃它们; b)他必须去手动查找执行查询的每个地方。 –

+0

@MK - Oracle一般只会在获取结果时实现结果(当然,除非必须获取所有数据才能在返回第一行之前对其进行排序)。所以如果你永远不会获取比前N行多的数据,你通常可以节省执行时间。当然,如果你告诉Oracle你只需要使用“ROWNUM”子句的前N行,那么通常不会有太多时间。理论上,JDBC驱动程序可以通过默认添加WHERE rownum <= N'子句来实现'setMaxRows' - 不知道Oracle JDBC驱动程序是否真的这样做。 –

+0

有趣。我已经看到除了setMaxRows之外,人们还会将WHERE rownum限制手动添加到Oracle查询中,但我从来没有对它进行基准测试。 –

2

我怀疑没有办法做到这一点。你可以创建一个AOP通知将与

"select * from (" + origQuery + ") where ROWNUM <= 5" 

修改每个的executeQuery()调用通过包裹查询,但我希望这是我们所谈论的临时或测试的事情。

+2

如果您动态修改所有SQL语句,则需要小心。 至少有一种情况下这种方法不起作用。例如,'select * from(从double中选择1 a,2 a);'将导致'ORA-00918:列不明确定义'。并且更改SQL语句可能会破坏一些性能调整方法,例如存储的轮廓。 –

+0

@jonearles同意了,看看我对此的评论是暂时的还是测试的东西:) –