1

我们希望淘汰 Oracle 仓库中的旧数据。

为了给出一个非常简单的概述,建议使用 PL SQL 存储过程开发一个流程,给定源/目标表等参数,使用 Oracle ALL_TAB_COLUMNS 视图来构建一个镜像源表的目标表。

如果 dest 表存在于以前的运行中,则建议的解决方案包括将源表的当前模式与目标(归档)表进行比较,如果发现差异,则使表同步。我确信所提议的功能存在局限性,但尽管该规范在这方面似乎相当雄心勃勃,但我怀疑他们是否打算在 PL-SQL 中重写 Red Gate 的 SQL 比较实用程序。

我想我有两个问题。

1) PL/SQL 真的是用于此类任务的正确语言吗?对我来说,存储过程用于快速输入和快速输出数据操作,而复杂的逻辑属于我认为功能更齐全的客户端语言,例如 C# 或其他一些 .NET 语言。我预计会有一个 10,000 行、缩进很差的单个存储过程,我对不得不审查它感到畏缩。我知道 Oracle SP/Pkgs 不需要这样,但由于某种原因,我们的开发人员在使用 PL\SQL 时往往比在 .NET 中编写时的模块化程度更低。我欢迎您的建议和您选择的理由。

2) 是否有可用于归档目的的 Oracle 实用程序(我认为我们使用的是 10g)?有没有人有任何建议建议?

在提供评论时,我会投票支持任何不重复的价值。

谢谢。

4

5 回答 5

4

PL/SQL 不仅仅用于“快速输入和快速输出”的数据操作。有一个非常丰富的应用程序建立在它之上。对于这类任务,PL/SQL 本身并没有什么问题。也就是说,如果您预计 PL/SQL 中有一个写得很糟糕的 10K 行过程,请不要使用它。让你的程序员做他们最擅长的事情。

于 2009-09-24T22:52:10.123 回答
3

首先,这听起来像是 PL-SQL 的任务。可以强制执行非模块化代码问题,使用 PL-SQL 会给您带来更好的结果并且更容易编写。

至于概念本身,如果要更新架构,您将执行的任何解决方案都会出现问题 - 同步将失败,或者更糟糕的是,它不会并且数据将被损坏。

如果有一个复制服务器,您可以从主服务器添加“删除旧记录”,并且只在离线服务器上执行插入/更新?这将允许您同时拥有所有数据并保持实时数据更小。

于 2009-09-24T22:49:21.587 回答
3

无论您“做什么”,都需要手工完成。

淘汰 RDBMS 中的数据充满了危险。因为您通常不能只归档单个表。您还需要归档它的所有依赖表。

然后是架构更改问题。与其说让你的档案与你不断发展的模式保持同步,不如说让你的工具与过时的模式保持同步。这不像您可以将当前应用程序指向“旧数据”并期望它一定能工作。很难让你的应用程序与当前数据保持同步,更不用说让它在旧数据上表现得合理了。

如果您正在选择数据的子集,那么手工制作 select 和 insert 语句、确保完整性、检查值等比依赖一些人为的工具更安全,实际上也更容易。前面可能看起来很艰巨,但实际上很乏味。

但是一旦完成,您将对导出和合并数据的内容和方式有更多的控制权。

用 PL/SQL 编写它很聪明,因为这是一个数据库操作。为什么要将所有数据拖出服务器只是为了将其塞回服务器。说完这些,PL/SQL 的东西可能会有更好的整体性能。

至于确保模块化、缩进等,嗯,这就是发明棒球棒的原因。

于 2009-09-24T22:58:43.580 回答
1

你说这是一个数据仓库。你在使用分区吗?如果是,分区方案是否标识了您要归档的行?如果这两个问题的答案都是“是”,那么分区交换可能就是您要搜索的功能。

于 2009-09-25T06:07:08.313 回答
0

也许我没有正确阅读要求,但不会简单

create <dest_table> as select * from <source_table>;

够了吗?如果它已经存在,首先在 dest_table 上放置?

于 2009-09-24T22:59:15.240 回答