Oracle Concurrent Requests / Retrieve在一个非常大的表上

时间:2018-03-27 23:44:15

标签: oracle

I1。我将有一个非常大的表,大约有10亿条记录(预先填充),并且将有15-20列,其中record_id为关键。

I2。我们每天获得多个文件,每个文件将有数千条记录,每条记录在处理这些记录时都应分配一个记录ID。我们还从Web应用程序获得一些请求,其中将在后端保留记录ID池。

I3。计划是编写存储过程以检索可用的记录ID / ID,并将每个记录(或)分配给Web UI请求。

Q1。我怎样才能在这里实现并发处理?由于同一记录ID或记录ID池不能分配给多个记录(或)到WEB UI请求,如何在此处实现并发处理?

Q2。如果有一个包含1000条记录的文件,我将调用存储过程来处理这个文件。那时如果我得到任何其他文件只有几千条记录,Oracle将如何处理这种情况。 oracle(或)oracle中是否有任何Queue概念默认锁定每个请求并按顺序一次处理一个请求?

请建议一些更好的设计来实现这一点。

1 个答案:

答案 0 :(得分:0)

  

Q1。如何在此处实现并发处理?

即使您想拥有两个数字池,您仍然可以使用序列:

create sequence web_ui_ids
    start with 1 increment by 2
/
create sequence back_end_ids
    start with 2 increment by 2
/

Web UI处理的记录将具有奇数ID,后端处理的记录将具有偶数ID。

显然,在你的场景中,start with子句需要考虑后面的记录数量,所以实际上你需要像

这样的东西
create sequence web_ui_ids
    start with 10000000001 increment by 2
/
create sequence back_end_ids
    start with 10000000002 increment by 2
/

如果你需要三个游泳池,那么只需相应地调整起始数字和增量。

  

Q2。 ... oracle中是否有任何Queue概念

Oracle内置了高级队列功能。这是一个消息传递系统,它与MQ,JMS等兼容Find out more

但是,你似乎不需要排队。您需要一个不断运行的PL / SQL程序,它会轮询文件目录中的新文件。最好这样做是一个带有预处理程序脚本的外部表来执行ls(如果在Windows上运行数据库,则为dir)。 Find out more

如果您打算拥有多个后台处理器,则只需要锁定。如果这是你的场景,你应该有一个要处理的文件表,并使用SELECT ... FOR UPDATE SKIP LOCKED语法取消工作。 Find out more