我的要求是从表中读取一些列。 源表有很多 - 大约20-30个数字列,我想从源表中只读取这些列的一组,并继续将这些列的值附加到目标表。我的DB在Oracle上,编程语言是JDBC / Java。
源表非常动态 - 经常发生插入和删除 它。而在目的地表,我想保持至少30的数据 天。 我的设置如下所述 - 数据库是Oracle。 源表中的行数= 20列,包含30列 目标表中的行数= 300行,2-3列
列都是数字。
我正在考虑不打开vanilla JDBC连接并传输数据, 看表的大小可能很慢。 我试图使用一些转储源表的选定列 sql喜欢 -
SQL> spool on
SQL> select c1,c5,c6 from SRC_Table;
SQL> spool off
稍后使用SQLLoader将数据加载到目标数据库中。
源表存储时间序列数据,并在2天内从源表中清除/删除数据。它是OLTP环境的一部分。目标表具有更长的保留期 - 可以在此处存储30天的数据,它是OLAP环境的一部分。因此,源表上的视图(其中视图仅选择源表中的列集)在此环境中不起作用。 欢迎对此方法提出任何建议或评论意见。
修改 我的表是分区的。复制数据的最简单方法是交换分区netween表
*ALTER TABLE <table_name>
EXCHANGE PARTITION <partition_name>
WITH TABLE <new_table_name>
<including | excluding> INDEXES
<with | without> VALIDATION
EXCEPTIONS INTO <schema.table_name>;*
但由于我的源表和目标表有不同的列,所以我认为交换分区不起作用。
答案 0 :(得分:1)
问题似乎有点模糊,坦白说有点奇怪。事实上,在一个表中有数百个列,并且您在数据库中复制数据,这表明了一个软管数据库设计。
不是手动操作,而是听起来像触发器的工作。在源表上创建一个插入触发器,以便在插入目标表后将列复制到目标表。
另一种可能性是,因为看起来你想要的只是原始表中数据的一部分,而不是复制它,这是数据库设计的主要原因,所以创建一个仅包含所需列和范围的视图。然后就像访问任何其他表一样访问该视图。
我愿意猜测问题的根源只是访问源表中所需的信息太慢了。这表明您可以通过更好的索引来解决这个问题。另外,你的源表可能太宽了。
由于我不是甲骨文的人,所以我将这个语法留作读者的练习,但这个概念应该是合理的。
答案 1 :(得分:1)
Shamik,好的,您正在使用OLTP数据加载OLAP数据库。
可接受的延迟是多少?在人们明天早上进入办公室之前,您的OLAP是否需要今天的数据,或者它是否接近实时。
说插入是“频繁”并不意味着什么。我们中的一些人已习惯了数千txns /秒 - 对其他人来说,1 / sec是很多。
你说有很多数据。同样的想法。我读过人们的帖子,他们有巨大的表,有几百万条记录。我有数千亿条记录。又来了。实数非常有用。
不要使用Schwern建议的触发器。如果您认为插入量很大,则意味着您可能在该区域遇到过问题。触发器会使情况变得更糟。
Oracle为从OLTP到OLAP的数据获取提供了许多不同的选择。不要重新发明轮子,而是使用已经写好的东西。 Oracle Streams BORN 可以完成这项工作。您可以使用Oracle AQ滚动自己的流。您可以使用数据库更改通知或更改数据捕获来捕获没有触发器的插入行。
这是一个非常常见的问题,这就是为什么我列出了4种旨在解决它的技术。
高级排队 流 更改数据捕获 数据库更改通知
开始使用Google搜索这些条款,然后回答有关这些条款的问题。你会比从头开始或使用触发器建立你自己更好。
答案 2 :(得分:0)