【发布时间】:2011-09-16 20:21:37
【问题描述】:
我有一个表格,我需要按类别进行限制,然后根据某个日期范围查找所有重叠日期。这大约需要 2 秒,对于以大约 50/s 发生的每笔交易来说,这是不可接受的。另一种方法是创建一些计数表 - 再说一次,我不知道这是多么棒的想法,因为事情可能会不同步。
Date on Rent # Rented Category
9/5/2011 5 CATEGORY1
在 Oracle(PL/SQL,如果重要的话)中,我如何才能保持这种性能,但确保并发事务不会通过使其比实际值少一或多一来搞砸增量/减量?
我有两种类型的交易,有点像搜索和租金。只有租金会更新这个计数表(并且搜索只是从中读取)。我不介意租金是否放缓,但不希望搜索性能受到影响。租金可高达 5-10 次/秒。
【问题讨论】:
-
你的问题有点糊涂:你真正想要什么?您是否真的用尽了改进原始查询的策略?你试过什么了?什么版本的数据库?哪个版本?数据是什么样的:表中的总行数、类别数、日期范围的广度?
-
日期范围最长可达 6 个月。大多数日期可能是 5 天,因为有滞纳金。我用的是10gR2。总行数约为 1200 万行。当我删除一些约束(我知道这些约束会导致问题并且可以解决)时,我可以将查询缩短到 1.7 秒,但这仍然太慢了。我需要它像0.02秒。查找重叠日期的约束类似于
AND to_date('07/05/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS') <= return_date AND to_date('07/18/2011 23:59:59', 'MM/DD/YYYY HH24:MI:SS') >= start_date。 -
请注意,这些行中的大多数是历史行,只需要查看当前行和未来行。
标签: oracle concurrency transactions