2011-10-18 88 views
1

我有一个相对较大的表(~100m记录),它基本上是一个XML存储。可以有多个具有不同时间戳的XML文档(使用最新时间戳=最新版本的逻辑)。我们期待每月批量的更新数据,可能会使用约70%数据的新版本。我们正在计划只保留商店中最新的2-3个版本,所以我猜测我们当前的B树索引(记录ID,时间戳)不一定是最快的?一个直接的“选择*从表中的时间戳”= YYYY-MM-DD顺序记录ID,时间戳“查询需要15小时才能完成昨晚 - 相当高规格的工具包,我不认为其他人正在使用DB当时。Oracle复合键自动递增(减量!?)

(re:查询本身,理想情况下,我只想选择时间戳大于或等于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   <...> 

等等等等 - 即作为一个新的版本出现时,最近的时间戳= 1版,和所有旧的记录得到版本=版本+ 1.这样我的管家脚本可以是一个简单的“删除版本> 3”(或者我们决定保留的任何东西),并且我可以在记录ID上有一个B树索引,并在版本上的二进制索引?

希望我没有完全找错了树 - 已经“创造性谷歌搜索”整个上午,这是理论,我拿出...

+0

每个月的批次可以达到约7000万行。但每日批次约达250万行。如果甚至有可能获得每日批次,那可能值得考虑。 –

+0

不可能 - 这是一个源头驱动的决定。但它有其好处 - 这意味着这些表格几乎每天都有空闲,数据被插入到这些表格中,每个月有一天,最新数据被提取并传递到前端系统。因此,插入/更新没有(实际)时间限制,但选择(和后续处理)有一个〜72小时的窗口,其中选择当前需要15个小时... – Andy

回答

0

我不知道递减版本将是一个好主意。唯一的方法是使用触发器查找匹配的记录ID并相应地更新它们。这对性能来说不是很好..

这就是我在我们的数据库环境(这是一个相似的大小)做类似的事情。希望它有用:

创建一个独立的归档表,将保存所有版本的记录。这将通过插入到主表的触发器来填充。触发器将insert记录的当前版本存入您的存档,并在主表上记录update,增加版本号并更新时间戳和数据。

然后,当你只需要选择最新版本的所有记录,你只需要做:

SELECT * FROM TABLE; 

如果您需要查看的数据如何看待在给定的点“快照”的能力时间,您还需要在表上使用valid_fromvalid_to列来记录每个版本的记录是最新版本的时间。当您写入归档表时,您可以使用触发器填充这些文件。

Valid_to关于最新版本的记录可以设置为可用的最大日期。插入更新版本的记录时,您会将之前版本的valid_to更新为新记录的valid_from之前(与避免愚蠢的情况不同)。

然后,当你想看到你的数据如何看待在给定时间,您查询日存档表使用SQL这样的:

SELECT * 
FROM ARCHIVE_TABLE a 
WHERE <time you're interested in> BETWEEN a.valid_from AND a.valid_to 
0

批处理工作比典型的插入/更新的办法肯定不同(ESP如果涉及触发器或许多索引)。即使使用体面的磁盘/硬件,您也会发现传统的DML方法在本卷上非常慢。对于那些你在批次每个月更新70毫米100毫米+表,我会建议寻找到类似的方法:

  1. 加载新的批处理文件(70毫米)到不同的表(NEW_XML),相同的格式为现有的表(EXISTING_XML)。使用nologging来避免撤消。

  2. 从EXISTING_XML追加NEW_XML中不存在的记录(30mm记录,基于您已经使用的任何关键字)。

  3. 重命名EXISTING_XML到HISTORY_XML和NEW_XML到EXISTING_XML。在这里,您需要一些停机时间,也许在一个周末休息几小时。这不会花费任何时间,但是您需要时间进行下一步(并且由于对象失效)。如果您上个月已经有HISTORY_XML,请先截断并放下它(保留1个月的旧数据)。

  4. 建立索引,统计,约束等因素对EXISTING_XML(现在包括新的数据也一样)。重新编译任何无效的对象,使用记录等

所以,简而言之,你就会有一个表(EXISTING_XML),不仅有新的数据,但建相对较快(数倍于DML快/触发器方法)。另外,如果需要,您可以尝试使用并行进行步骤2。

希望有所帮助。