从oracle数据库中选择许多记录的有效方法(或在短时间内)

时间:2016-08-24 10:19:59

标签: database oracle

我目前正在开发一个程序,用于根据表的数量从数据库中检索记录。

这是我的sql cmd字符串。

select distinct a.id,
                a.name,
                b.status,
                b.date
from table1 a
left join table2 b
    on a.id = b.id where #$%^$#%@

有些表格有大约5000万条以上的记录。在大多数情况下,套接字不会返回超时错误,因为用户将输入where子句以获取他们想要的内容。但是,当程序尝试从数据库中检索所有记录时,它将显示套接字错误,因为它需要太多时间来检索不允许的内容。

我的一个目的是限制使用rownum检索的行,因为用户可能并不真正需要来自表的这么多数据。例如,用户可以输入他们想要检索10个thoursands记录的最大行数。我会将10000条记录返还给他们。但是我无法使用rownum<检索相同数量的记录。 10000,我也不知道它是如何工作的......

所以我在这里要求专业开发人员提出任何建议。请帮忙!非常感谢!!!!

3 个答案:

答案 0 :(得分:2)

首先,你必须明确(自己)你需要什么数据。

如果您需要生成整体统计信息,那么您需要所有数据。保存中间结果可能有所帮助,但您仍然必须阅读所有内容。在这种情况下,将套接字超时设置为大约24小时,只需确保您的SELECT不会阻止其他进程。

但是如果你正在创建一个客户端应用程序(在HTML表格中显示一些数据),那么你绝对不需要一切。设计您的应用程序,以便用户首先应用过滤器,然后他们会收到第一个结果页面,然后是第二个...查看Google搜索或电子商店如何工作 - 您首先获得一个空主页(可能有一些促销),之后您开始过滤。

其次,技术思路:

  • 在Oracle 12中实施了限制,因此您可以使用SELECT * FROM table OFFSET 0 ROWS FETCH NEXT 10000 ROWS ONLY。对于旧版本,您必须使用旧的WHERE rownum <= 10000,这与ORDER BY不兼容。
  • 使用聚合等时保存中间结果
  • 最大限度地减少JOIN(denormalize)的需要。

答案 1 :(得分:0)

我可以考虑使用优化器提示告诉Oracle您希望快速前n行,如下所述:https://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#4942

答案 2 :(得分:0)

其他两个答案已经提到您可以使用order by子句和rownum实现分页,如下所示:

select * from (
  SELECT *, rownum rnum FROM (SELECT foo FROM Foo ORDER BY OFR_ID) WHERE rownum <= stopOffset 
) where rnum >=startOffset

或在现代Oracle中使用OFFSET。 我想指出当你想要检索许多(如hundrend数千到数百万)行以在应用程序中处理它们时出现的其他内容 - 确保设置足够大的获取大小(通常在1000 <?<5000范围内)。通常,当您检索具有默认提取大小的结果时,执行时间与使用较大的提取大小检索结果时的执行时间存在很大差异,因为已知有大量行。例如,在Java中,您可以在制作查询时在Statement对象上显式设置fetchSize:

PreparedStatement statement = connection.prepareStatement(query);
statement.setFetchSize(1000);