问题描述
嗨,
我需要定义两个表来存储今天的事务数据和昨天的事务数据。
我的应用程序从另一个系统获取事务文件。
当天的交易文件将被加载到今天的数据表中。
但在执行此操作之前,我们需要将数据从今天的数据表加载到昨天的数据表,然后清理/清空今天的数据表。
因此,这是数据加载的顺序:
1.将数据从今天的表加载到昨天的表
2.删除今天表中的所有记录
3.将今天的交易文件中的数据加载到今天的表中
我们如何以最有效的方式执行步骤1和步骤2 ?
我可以删除昨天的表,然后将今天的表重命名为昨天的表吗?
创建一个新的今天表,并从今天的事务文件中加载数据?
使用分区表是否有更好的替代方法来替代上述步骤?
请澄清。
谢谢你。
珍
我需要定义两个表来存储今天的事务数据和昨天的事务数据。
我的应用程序从另一个系统获取事务文件。
当天的交易文件将被加载到今天的数据表中。
但在执行此操作之前,我们需要将数据从今天的数据表加载到昨天的数据表,然后清理/清空今天的数据表。
因此,这是数据加载的顺序:
1.将数据从今天的表加载到昨天的表
2.删除今天表中的所有记录
3.将今天的交易文件中的数据加载到今天的表中
我们如何以最有效的方式执行步骤1和步骤2 ?
我可以删除昨天的表,然后将今天的表重命名为昨天的表吗?
创建一个新的今天表,并从今天的事务文件中加载数据?
使用分区表是否有更好的替代方法来替代上述步骤?
请澄清。
谢谢你。
珍
专家解答
是的,你的过程:
-昨天就掉了
-重命名今天->昨天
-今天创建(作为选定内容)
会有用的。它也会很好很有效。不过,如果您在表上有很多授权/索引/触发器,那么构建这个过程可能会很麻烦。您还将使任何引用这些表的PL/SQL失效。
如果您获得分区许可,则另一种方法可以是:
-从昨天的表中删除数据
-今天和昨天的分区交换
-今天将数据插入
截断昨天的数据应该是删除数据的最有效的方法。这将意味着在执行此操作之后,昨天的表对于所有会话都是空的。一旦你对交换进行了分区,那么今天的表将是空的。
当然,如果你有分区,那么有一个更好的选择:
有一个按日期分区的表。
那么,您的流程就是:
-将数据加载到新分区
-截断/删除最早的分区
设置时间间隔命令用于防止ORA-14758错误。更多有关此信息,请访问:
https://connormcdonald.wordpress.com/2015/11/25/ora-14758-last-partition-cannot-be-dropped/
-昨天就掉了
-重命名今天->昨天
-今天创建(作为选定内容)
会有用的。它也会很好很有效。不过,如果您在表上有很多授权/索引/触发器,那么构建这个过程可能会很麻烦。您还将使任何引用这些表的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




