JDBC setMaxRows数据库用法

Fra*_*fka 6 java database oracle postgresql jdbc

我试图用JDBC编写一个独立于数据库的应用程序.我现在需要一种从某些表中获取前N个条目的方法.我看到setMaxRowsJDBC中有一个方法,但我觉得使用它并不舒服,因为我害怕数据库会推出所有结果,只有JDBC驱动程序会减少结果.如果我需要在具有十亿行的表格中获得前5个结果,这将打破我的脖子(该表具有可用的索引).

为每种类型的数据库编写特殊的SQL语句并不是很好,但是会让数据库做出聪明的查询计划并停止获取超出必要的结果.

我可以依靠setMaxRows告诉数据库不起作用吗?

我想在最糟糕的情况下,我不能依赖于希望的方式工作.我最感兴趣的是Postgres 9.1和Oracle 11.2,所以如果有人有这些数据库的经验,请向前迈进.

Erw*_*ter 3

将使数据库进行巧妙的查询规划并停止获取不必要的结果。

如果你使用

PostgreSQL

SELECT * FROM tbl ORDER BY col1 LIMIT 10; -- slow without index
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT * FROM tbl LIMIT 10;               -- fast even without index
Run Code Online (Sandbox Code Playgroud)

甲骨文

SELECT *
FROM   (SELECT * FROM tbl ORDER BY col1 DESC)
WHERE  ROWNUM < 10;
Run Code Online (Sandbox Code Playgroud)

..那么只会返回10 行。但是,如果您在选择前 10 名之前对行进行排序,则所有基本符合条件的行都将在排序之前被读取。

匹配索引可以避免这种开销!


如果您不确定 JDBC 实际发送到数据库服务器的内容,请运行测试并让数据库引擎记录收到的语句。在 PostgreSQL 中你可以设置postgresql.conf

log_statement = all
Run Code Online (Sandbox Code Playgroud)

(并重新加载)以记录发送到服务器的所有语句。请务必在测试后重置该设置,否则您的日志文件可能会变得巨大。