我有一个相对较大的表(大约100米记录),它基本上是一个XML存储。可以有多个具有不同时间戳的XML文档(逻辑是最新的时间戳=最新版本)。我们预计每月会有一批更新的数据,可能会有70%的新版本。
我们计划只保留最近的2-3版本的商店,所以我猜我们当前的b-树索引(记录ID,时间戳)不一定是最快的?一个直截了当的"select * from表,其中时间戳>= yyyy dd按记录id,时间戳“查询昨晚花了15个小时才完成-相当高规格的工具包,我认为当时没有其他人在使用DB。
(re:查询本身,理想情况下,我只想选择带有时间戳>= yyyy的最新文档,但这不是什么问题)。
是否有任何方法可以创建自动减量列,如下所示:
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 <...>
等等
希望我没有完全疯掉--整个早上都在“创造性地搜索”,这就是我想出的理论.
发布于 2011-10-18 11:32:26
我不确定减少版本会是个好主意。唯一的方法是使用触发器查找匹配的记录ids并相应地更新它们。这对表演来说不太好。
这就是我在我们的数据库环境中所做的类似的事情(类似的大小)。希望它有用:
创建一个独立的存档表,该表将保存所有版本的记录。这将由插入到主表的触发器填充。触发器将把当前版本的记录放入存档中,并在主表上insert
记录,增加版本号并更新时间戳和数据。
然后,当您只需要选择所有记录的最新版本时,只需:
SELECT * FROM TABLE;
如果需要查看数据在给定时间点上的“快照”,还需要表上的valid_from
和valid_to
列来记录每个版本的记录是最新版本的时间。您可以在写入存档表时使用触发器填充这些触发器。
在最新版本的记录上的Valid_to
可以设置为最大可用日期。当插入一个较新版本的记录时,您将更新上一个版本的valid_to
,使其位于新记录的valid_from
之前(为了避免dupes,它不一样)。
然后,当您想查看给定时间的数据时,可以使用SQL查询存档表,如:
SELECT *
FROM ARCHIVE_TABLE a
WHERE <time you're interested in> BETWEEN a.valid_from AND a.valid_to
发布于 2011-10-18 12:39:49
批处理工作与典型的insert/update方法(尤其是涉及触发器或多个索引的情况下)明显不同。即使有了像样的磁盘/硬件,您也会发现传统的DML方法对于这个卷非常慢。对于每月批量更新70 to以上的100 to以上表,我建议研究一种类似于:
因此,简单地说,您将拥有一个表(EXISTING_XML),它不仅具有新的数据,而且构建速度相对较快(比DML/触发器方法快很多倍)。此外,如果需要的话,您可以尝试在步骤2中使用并行。
希望这能有所帮助。
https://stackoverflow.com/questions/7806382
复制相似问题