【发布时间】:2011-10-18 11:19:20
【问题描述】:
我有一个相对较大的表(约 100 万条记录),它基本上是一个 XML 存储。可以有多个具有不同时间戳的 XML 文档(最新时间戳 = 最新版本的逻辑)。我们预计每月会有一批更新的数据,其中可能包含约 70% 的数据的新版本。
我们计划只在商店中保留最新的 2-3 个版本,所以我猜我们当前的 b-tree 索引(记录 ID、时间戳)不一定是最快的?昨晚,一个简单的“select * from table where timestamp >= yyyy-mm-dd order by record id, timestamp”查询花了 15 个小时才完成——相当高规格的工具包,我认为没有其他人在使用当时的数据库。
(回复:查询本身,理想情况下我只想选择时间戳 >= yyyy-mm-dd 的最新文档,但现在这不是问题)。
有什么办法可以创建一个自动递减列,如下:
Record ID Timestamp Version XML
1 2011-10-18 1 <...>
1 2011-10-11 2 <...>
1 2011-10-04 3 <...>
2 2011-10-18 1 <...>
2 2011-10-11 2 <...>
etc etc - 即,当新版本出现时,最近的时间戳 = 版本 1,所有旧记录得到版本 = 版本 + 1。这样我的内务脚本可以是一个简单的“删除版本 > 3"(或我们决定保留的任何内容),我可以在记录 ID 上使用 b-tree 索引,在版本上使用二进制索引?
希望我没有完全在错误的树上吠叫 - 整个早上都在“创造性地谷歌搜索”,这就是我提出的理论......
【问题讨论】:
-
每月批处理大约有 7000 万行。但是每天的批处理量大约为 250 万行。如果甚至有可能获得每日批次,那可能值得考虑。
-
不可能——这是一个源驱动的决定。不过,它有它的好处 - 这意味着这些表几乎处于空闲状态,除了每月 1 天将数据插入其中,以及每月 1 天提取最新数据并将其传递到前端系统.所以插入/更新没有(实际的)时间限制,但选择(和后续处理)有一个约 72 小时的窗口,其中选择当前需要 15 小时......