Oracle数据库行检查点

时间:2012-12-17 02:47:53

标签: sql database oracle row checkpoint

我正在尝试从oracle数据库表中抓取数据,并希望有一个解决方案来为行创建检查点。

  • 基本上,抓取工具最多会抓取500行,然后停止 处理数据的应用程序。 2分钟后,爬虫必须 从最后一行(检查站)继续。

  • 目前,我正在使用rownumber的解决方案,但结果 表示缺少一些行。

这可能是一个基本问题,但对处理数据库缺乏经验。我找不到可接受的解决方案。

1 个答案:

答案 0 :(得分:2)

通常,您不会以这种方式设计系统。通常,您的应用程序只需打开一个游标,获取500行,处理应用程序中的那些行,获取接下来的500行等等。只要您不关闭游标,Oracle将继续返回系统中的结果打开光标时更改编号(SCN)。打开游标后添加的任何行都将不会返回,将返回光标打开后删除的所有行。由于读者不会阻止Oracle中的编写者,因此这种方法不会阻止任何其他应用程序使用该表(这通常是其他数据库中的问题)。

如果您真的想按照描述的方式设计系统,则需要一个列(或一组列),您可以按顺序排序。这必须类似于单调增加的主键(例如序列生成的主键)。然后你可以做类似

的事情
SELECT *
  FROM( SELECT a.*,
               rownum rn
          FROM( SELECT *
                  FROM table_name
                 ORDER BY some_key ) a
         WHERE rownum <= MAX_ROW)
 WHERE rn >= MIN_ROW

当然,通过这种分页查询,当您走向表的“结束”时,您的进程将变得越来越慢。获得前500行将是合理有效的,因为您只需排序前500行。当您从9,500到10,000获取行时,您将对数据进行排序20倍,以便查询可能会慢一个数量级。如果你的桌子很大,这通常会导致性能很差。您可以(略微)通过添加在内部查询中翻转顺序的逻辑来提高性能,并在获取一半页面后开始提取“早期”页面。

这种方法也可能错过行。例如,如果插入ID 502的事务提交,则获取行501-550,然后插入“ID”501的事务提交,您将看到行502但不会显示行501。