从自定义队列中选择下一条消息的速度慢

Mic*_*ard 3 sql sorting oracle indexing queue

我有一个简单的基于表的队列系统.在最简单的形式中,它由id,队列名称和状态组成.当从给定队列中读取下一条消息时,我们需要确保FIFO(先进先出),即具有给定状态的给定队列中的最低id.这一切都可以正常运行几千行,但是当我们达到1M +行时,它就不再适合了.

我们不能使用rownum = 1,因为这是在排序之前完成的,排序是基于id列完成的(asc).如果我制作一个游标并按id排序1000次,这大约需要100ms,这是一个很好的性能(0.1 ms /循环).如果我在查询中包含状态和队列名称(我需要,因为我需要特定队列的未读消息的最低id),10个循环(130ms /循环)需要大约1300ms,这远远不行.

我尝试在三列中的每一列上都有一个索引,也是id,queue,status的组合索引,最后是id的索引和队列和状态的组合索引.id列也是主键.已经在基于规则的设置中尝试了所有组合(使用规则提示).

此致,Michael Ringholm Sundgaard - iHedge A/S www.ihedge.dk www.ibrain.dk

Tom*_*m H 5

我尝试过的索引中没有提到的一件事就是(queue,status,id)上的索引.如果你将id放在索引的开头,它会破坏索引的使用,因为你正在寻找"最低的",这在其他标准被应用之前是没有意义的.

索引中列的排序通常与实际列本身一样重要.