我有这段代码来获取每条记录的位置:
Message.all.each_with_index do |msg, i|
message_order[msg.id] = i
end
但是现在我有 100k+ 条消息,并且遍历所有记录需要很长时间。谁能告诉我如何做到这一点更高效?(我正在使用甲骨文)
我考虑了rownum,但没有找到解决方案。仅返回一条消息的位置的解决方案会很棒。
我有这段代码来获取每条记录的位置:
Message.all.each_with_index do |msg, i|
message_order[msg.id] = i
end
但是现在我有 100k+ 条消息,并且遍历所有记录需要很长时间。谁能告诉我如何做到这一点更高效?(我正在使用甲骨文)
我考虑了rownum,但没有找到解决方案。仅返回一条消息的位置的解决方案会很棒。
我不知道我是否理解你的问题。
如果您需要具有指定订单 id(例如:5)的消息,您可以执行以下操作:
SELECT message
FROM (SELECT message, ROWNUM AS ID
FROM (SELECT message
FROM tab1
ORDER BY some_date))
WHERE ID = 5;
或者,使用分析函数:
SELECT message
FROM (SELECT message,
ROW_NUMBER() OVER(ORDER BY some_date) AS ID
FROM tab1)
WHERE ID = 5;
这应该有效:
Message.where("id < :id", id: msg.id).count