首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >甲骨文复合密钥自动增值(削减!?)

甲骨文复合密钥自动增值(削减!?)
EN

Stack Overflow用户
提问于 2011-10-18 11:19:20
回答 2查看 478关注 0票数 1

我有一个相对较大的表(大约100米记录),它基本上是一个XML存储。可以有多个具有不同时间戳的XML文档(逻辑是最新的时间戳=最新版本)。我们预计每月会有一批更新的数据,可能会有70%的新版本。

我们计划只保留最近的2-3版本的商店,所以我猜我们当前的b-树索引(记录ID,时间戳)不一定是最快的?一个直截了当的"select * from表,其中时间戳>= yyyy dd按记录id,时间戳“查询昨晚花了15个小时才完成-相当高规格的工具包,我认为当时没有其他人在使用DB。

(re:查询本身,理想情况下,我只想选择带有时间戳>= yyyy的最新文档,但这不是什么问题)。

是否有任何方法可以创建自动减量列,如下所示:

代码语言:javascript
运行
复制
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         <...>

等等

希望我没有完全疯掉--整个早上都在“创造性地搜索”,这就是我想出的理论.

EN

回答 2

Stack Overflow用户

发布于 2011-10-18 11:32:26

我不确定减少版本会是个好主意。唯一的方法是使用触发器查找匹配的记录ids并相应地更新它们。这对表演来说不太好。

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

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

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

代码语言:javascript
运行
复制
SELECT * FROM TABLE;

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

在最新版本的记录上的Valid_to可以设置为最大可用日期。当插入一个较新版本的记录时,您将更新上一个版本的valid_to,使其位于新记录的valid_from之前(为了避免dupes,它不一样)。

然后,当您想查看给定时间的数据时,可以使用SQL查询存档表,如:

代码语言:javascript
运行
复制
SELECT *
FROM ARCHIVE_TABLE a
WHERE <time you're interested in> BETWEEN a.valid_from AND a.valid_to
票数 0
EN

Stack Overflow用户

发布于 2011-10-18 12:39:49

批处理工作与典型的insert/update方法(尤其是涉及触发器或多个索引的情况下)明显不同。即使有了像样的磁盘/硬件,您也会发现传统的DML方法对于这个卷非常慢。对于每月批量更新70 to以上的100 to以上表,我建议研究一种类似于:

  1. 将新批处理文件(70 as )加载到单独的表(NEW_XML)中,与现有表(EXISTING_XML)的格式相同。使用nologging以避免撤消。
  2. 追加(nologging)记录来自NEW_XML中不存在的记录(30 on recs,基于您已经使用的任何键)。
  3. 将EXISTING_XML重命名为HISTORY_XML,NEW_XML重命名为EXISTING_XML。在这里,你需要一些休息时间,也许一个周末的休息时间。这并不需要任何时间,但您需要时间进行下一步(并且由于对象无效)。如果您已经有了前一个月的HISTORY_XML,那么首先截断并删除它(保存一个月的旧数据)。
  4. 在EXISTING_XML上构建索引、统计数据、约束等(现在还包含新的数据)。重新编译所有失效的对象,使用日志记录等

因此,简单地说,您将拥有一个表(EXISTING_XML),它不仅具有新的数据,而且构建速度相对较快(比DML/触发器方法快很多倍)。此外,如果需要的话,您可以尝试在步骤2中使用并行。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7806382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档