【问题标题】:Duplicate set of columns from one table to another table将一组列从一个表复制到另一个表
【发布时间】:2010-10-05 23:55:26
【问题描述】:

我的要求是从表中读取一组列。 源表有很多 - 大约 20-30 个数字列,我想只从源表中读取一组这些列,并继续将这些列的值附加到目标表中。我的数据库在 Oracle 上,编程语言是 JDBC/Java。

源表是非常动态的 - 经常发生插入和删除 它。而在目标表中,我想将数据保留至少 30 天。 我的设置描述如下 - 数据库是甲骨文。 源表中的行数 = 2000 万行,30 列 destinationt 表中的行数 = 3 亿行,2-3 列

所有列都是数字。

我正在考虑不打开普通 JDBC 连接并传输数据, 从表格的大小来看,这可能会很慢。 我正在尝试使用一些转储源表的选定列 sql 喜欢 -

SQL> spool on
SQL> select c1,c5,c6 from SRC_Table;
SQL> spool off

稍后使用 SQLLoader 将数据加载到目标数据库中。

源表正在存储时间序列数据,数据会在 2 天内从源表中清除/删除。它是 OLTP 环境的一部分。目标表的保留期较长——可以在这里存储 30 天的数据,它是 OLAP 环境的一部分。因此,视图仅从源表中选择一组列的源表视图在此环境中不起作用。 欢迎对这种方法提出任何建议或评论 cmets。

编辑 我的表是分区的。复制数据最简单的方法是交换分区网表

*ALTER TABLE <table_name>
EXCHANGE PARTITION <partition_name>
WITH TABLE <new_table_name>
<including | excluding> INDEXES
<with | without> VALIDATION
EXCEPTIONS INTO <schema.table_name>;*

但由于我的源表和目标表有不同的列,所以我认为交换分区不起作用。

【问题讨论】:

  • 请提供一些示例数据,5-7 行:你有什么和你想得到什么。
  • 一张表中有数百个?这很糟糕,嗯。
  • 我是论坛的新手,不知道如何编辑主要问题以提供更多信息。
  • 伙计,我希望列名不是真正的 c1、c5 和 c6

标签: java sql oracle jdbc


【解决方案1】:

Shamik,好的,您正在使用 OLTP 数据加载 OLAP 数据库。

可接受的延迟是多少?您的 OLAP 在人们明天早上来办公室之前是否需要今天的数据,或者它是否更接近实时。

说插入“频繁”并不意味着什么。我们中的一些人已经习惯了数千个 txns/sec - 对其他人来说 1/sec 已经很多了。

你说有很多数据。同样的想法。我读过人们的帖子,他们有包含几百万条记录的巨大表格。我有数千亿条记录的表。再次如此。实数非常有用。

不要使用 Schwern 建议的触发器。如果您认为您的插入量很大,则意味着您可能在该区域遇到了问题。触发器只会让事情变得更糟。

Oracle 为将数据从 OLTP 获取到 OLAP 提供了许多不同的选择。与其重新发明轮子,不如使用已经写好的东西。 Oracle Streams 天生就是为了完成这项工作。您可以使用 Oracle AQ 滚动您自己的流。您可以使用数据库更改通知或更改数据捕获来捕获插入的行而无需触发器。

这是一个极其常见的问题,因此我列出了 4 种旨在解决该问题的技术。

高级队列 流 变更数据捕获 数据库更改通知

开始在 Google 上搜索这些术语,然后返回有关这些术语的问题。你会比从头开始构建自己的或使用触发器更好。

【讨论】:

  • 嗨,马克,感谢 cmets。我想知道 straming 是否只是一张桌子的过度杀伤力。但我会对此进行更多研究。
  • 更好的问题是,只为一张表重建流式传输是否过大。你可能认为它是矫枉过正,因为你没有使用它。这只是对某些包的一些调用。但是,如果您想自己动手,请从 AQ 开始。这很容易设置。
【解决方案2】:

这个问题似乎有点模糊,坦率地说有点奇怪。一个表中有数百列,并且您在数据库中复制数据,这一事实表明数据库设计非常紧凑。

这听起来像是触发器的工作,而不是手动执行。在源表上创建一个插入触发器,以便在插入列后将列复制到目标表。

另一种可能性是,由于您似乎只需要原始表中的数据切片,而不是复制它,这是数据库设计的一个大罪,因此创建一个仅包含您想要的列和范围的视图。然后像访问任何其他表一样访问该视图。

我愿意猜测问题的根源是在源表中访问您想要的信息太慢了。这表明您可以通过更好的索引来解决这个问题。此外,您的源表可能太宽了。

由于我不是 Oracle 人员,我将其语法留给读者作为练习,但概念应该是正确的。

【讨论】:

  • Shamik.... 完全同意!如果复制数据是大罪,我们就不需要 ETL 或复制工具。 REAL Cardinal Sin 正试图针对 OLTP 数据库创建复杂的报告。这些往往是巨大的。巨大的 SQL,巨大的性能猪。
  • 等等,你是在两个不同的数据库之间推送数据吗?
  • 即使不是,即使它们是同一个数据库中的 OLAP 和 OLTP 表集,它仍然不是 HOSED。你需要考虑到这样一种可能性,即使是那些 75% 不正确的东西在某些时候仍然可以用来提高效率。
  • @Mark 我请求对OLAP/OLTP一无所知。当我回复时,帖子中缺少很多细节。如果 OP 被一些固定的模式卡住,那是一回事,但是当有人提出一个涉及复制数据和非常宽的表的解决方案时,我立即对模式持怀疑态度。
【解决方案3】:

顺便说一句,您可能想看看 Oracle 的分区 herehere

分区可以将表和索引拆分为更小、更易于管理的组件,并且是任何具有高性能和高可用性要求的大型数据库的关键要求。除了订单日期(范围)和区域(列表)或区域(列表)和客户类型(列表)两种方法的复合分区之外,Oracle 数据库 11g 还提供最广泛的分区方法选择,包括间隔、引用、列表和范围.

  • 更快的性能 - 将查询时间从几分钟缩短到几秒
  • 提高可用性 - 24 到 7 次访问关键信息
  • 提高可管理性 - 管理更小的数据“块”
  • 启用信息生命周期管理 - 经济高效地使用存储

here 所述,将表划分为每日分区将使归档更容易

【讨论】:

  • SOME 查询从几分钟缩短到几秒钟。不使用 where 子句中的分区键的查询将走相反的方向。
  • 我的表已分区。复制数据最简单的方法是交换分区,但由于我的源表和目标表有不同的列,所以我认为交换分区不起作用。有没有cmets?
  • 没错。只有当一切都相同时,您才能进行交换……索引、压缩、而不是表空间……等等。
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 2012-07-21
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多