我们有一个系统,我们有一个项目集合(> 100 万),还有几个处理它的东西。每个处理器应该只处理每个项目一次,并且处理器有一个层次结构。
我们当前的实现是有一个“已处理”表来跟踪每个处理器已经完成的工作:
CREATE TABLE items (id NUMBER PRIMARY KEY, ...)
CREATE TABLE itemsProcessed(
item NUMBER REFERENCES items(id),
processor NUMBER)
我们的查询是这样的(itemsProcessed
上面有相关的索引)——我们使用 NOT IN 来过滤掉当前处理器或其祖先已经处理过的项目:
SELECT ... FROM items i WHERE <additional queries on items>
AND id NOT IN (SELECT item FROM itemsProcessed WHERE processor IN (1, 2))
当处理的表变得非常大时,此查询开始花费很长时间(几秒钟),因为它必须在开始返回第一项之前进行大量过滤(查询计划使用哈希反连接)
我们需要这个查询非常快速地返回前几项——理想情况下返回500 毫秒内的前几项。这意味着它不能迭代items
并过滤掉itemsProcessed
. 所以我们需要一些方法来对items
and的连接做一个否定索引itemsProcessed
(我们已经在 mongo 上完成了这个,但是 oracle 似乎不能做类似的事情)
甲骨文有可能吗?