暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何将数据从今天的表加载到昨天的表

askTom 2016-03-23
351

问题描述

嗨,

我需要定义两个表来存储今天的事务数据和昨天的事务数据。

我的应用程序从另一个系统获取事务文件。
当天的交易文件将被加载到今天的数据表中。
但在执行此操作之前,我们需要将数据从今天的数据表加载到昨天的数据表,然后清理/清空今天的数据表。

因此,这是数据加载的顺序:

1.将数据从今天的表加载到昨天的表
2.删除今天表中的所有记录
3.将今天的交易文件中的数据加载到今天的表中

我们如何以最有效的方式执行步骤1和步骤2 ?
我可以删除昨天的表,然后将今天的表重命名为昨天的表吗?
创建一个新的今天表,并从今天的事务文件中加载数据?
使用分区表是否有更好的替代方法来替代上述步骤?
请澄清。

谢谢你。

专家解答

是的,你的过程:

-昨天就掉了
-重命名今天->昨天
-今天创建(作为选定内容)

会有用的。它也会很好很有效。不过,如果您在表上有很多授权/索引/触发器,那么构建这个过程可能会很麻烦。您还将使任何引用这些表的PL/SQL失效。

如果您获得分区许可,则另一种方法可以是:

-从昨天的表中删除数据
-今天和昨天的分区交换
-今天将数据插入

截断昨天的数据应该是删除数据的最有效的方法。这将意味着在执行此操作之后,昨天的表对于所有会话都是空的。一旦你对交换进行了分区,那么今天的表将是空的。

create table today partition by range (x) (
  partition p0 values less than (maxvalue)
) as 
  select rownum x, sysdate-1 y from dual connect by level <= 5;

create table yesterday as 
  select rownum x, sysdate-2 y from dual connect by level <= 5;
 
select trunc(y), count(*) from today group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
22-MAR-2016 00:00:00          5

select trunc(y), count(*) from yesterday group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
21-MAR-2016 00:00:00          5

truncate table yesterday;

alter table today exchange partition p0 with table yesterday ;

select trunc(y), count(*) from today group by trunc(y);

no rows selected

select trunc(y), count(*) from yesterday group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
22-MAR-2016 00:00:00          5

insert into today 
  select rownum, sysdate from dual connect by level <= 5;
 
select trunc(y), count(*) from today group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
23-MAR-2016 00:00:00          5

select trunc(y), count(*) from yesterday group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
22-MAR-2016 00:00:00          5


当然,如果你有分区,那么有一个更好的选择:

有一个按日期分区的表。

那么,您的流程就是:

-将数据加载到新分区
-截断/删除最早的分区

create table all_dates 
  partition by range (y) interval (numtodsinterval(1, 'day')) (
  partition p0 values less than (date'2016-03-22')
) as 
  select mod(rownum, 5)+1 x, sysdate-ceil(rownum/5) y 
  from   dual connect by level <= 10;
  
select trunc(y), count(*) from all_dates group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
22-MAR-2016 00:00:00          5
21-MAR-2016 00:00:00          5
  
insert into all_dates  
  select rownum x, sysdate y 
  from   dual connect by level <= 5;

select trunc(y), count(*) from all_dates group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
22-MAR-2016 00:00:00          5
21-MAR-2016 00:00:00          5
23-MAR-2016 00:00:00          5

alter table all_dates set interval ( numtodsinterval (1,'DAY') );

alter table all_dates drop partition p0;

select trunc(y), count(*) from all_dates group by trunc(y);

TRUNC(Y)               COUNT(*)
-------------------- ----------
22-MAR-2016 00:00:00          5
23-MAR-2016 00:00:00          5

设置时间间隔命令用于防止ORA-14758错误。更多有关此信息,请访问:

https://connormcdonald.wordpress.com/2015/11/25/ora-14758-last-partition-cannot-be-dropped/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论