【发布时间】:2010-12-28 03:26:31
【问题描述】:
我有一个简单的基于表格的队列系统。在最简单的形式中,它由一个 id、一个队列名称和一个状态组成。从给定队列中读取下一条消息时,我们需要确保 FIFO(先进先出),即具有给定状态的给定队列中的最低 id。这一切都适用于几千行,但当我们达到 1M+ 行时,它就不再顺利了。
我们不能使用 rownum = 1,因为这是在排序之前完成的,排序仅基于 id 列 (asc)。如果我创建一个游标并按 id 排序 1000 次,这总共需要大约 100 毫秒,这是一个很好的性能(0.1 毫秒/循环)。如果我在查询中包含状态和队列名称(我需要,因为我需要特定队列的未读消息的最低 id),10 次循环(130 毫秒/循环)大约需要 1300 毫秒,这远非正常。
我已经尝试在三列中的每一列上都有一个索引,还有一个关于 id、队列、状态的组合索引,最后是一个与 id 上的索引的组合,以及一个关于队列和状态的组合索引。 id 列也是主键。所有组合都已在基于规则的设置中尝试过(使用规则提示)。
最好的问候, Michael Ringholm Sundgaard - iHedge A/S www.ihedge.dk www.ibrain.dk
【问题讨论】:
-
你能告诉我们查询和解释计划吗?
标签: sql oracle sorting queue indexing