我正在尝试从oracle数据库表中抓取数据,并希望有一个解决方案来为行创建检查点。
基本上,抓取工具最多会抓取500行,然后停止 处理数据的应用程序。 2分钟后,爬虫必须 从最后一行(检查站)继续。
目前,我正在使用rownumber的解决方案,但结果 表示缺少一些行。
这可能是一个基本问题,但对处理数据库缺乏经验。我找不到可接受的解决方案。
答案 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。