2015-11-06 67 views
0

我有一张大量数据的表格。它按周分区。该表包含名为group的列。每个group可能有多个星期的记录。例如:如何加速从按日期分区的表创建表?

列表项

gr week data 
    1  1 10 
    1  2 13 
    1  3  5 
    .  .  6 
    2  2 14 
    2  3 55 
    .  .  . 

我想创建基于一个group表。目前创建Oracle 11g需要大约23分钟。这是很长一段时间,因为我必须重复每个组的过程,并且我有很多组。什么是创建表的最快捷方式?

+0

你需要两个表中的数据 - 源和目的地吗?或者您将在复制之后从源表中删除数据? – Tatiana

+0

您需要提供更多详细信息。你究竟如何创建“基于一个组的表格”?什么是“巨大”的数据量?表和索引定义是什么?就目前来看,这个问题是无法回答的。 – mustaccio

+0

是的,我需要两个。事实上,源表是物理表,目标表是临时表,在使用存储的数据后将被删除。 –

回答

0

创建所有的表,然后使用INSERT ALL当 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm#i2145081

的数据将只能读取一次。

insert all 
    when gr=1 then 
    into tab1 values (gr, week, data) 
    when gr=2 then 
    into tab2 values (gr, week, data) 
    when gr=3 then 
    into tab3 values (gr, week, data) 
select * 
from big_table 
+0

谢谢你的回应。问题是我正在处理大约30亿条记录,我会打击表空间。我必须从一个组创建一个表,当我完成了该组的工作后,我删除表并为不同的组创建表等等。还有其他建议吗? –

0

最好的提速到达,如果你不复制组的基础和工艺上的数据,然后按周,但你不说你会到达什么,所以这是不可能发表评论(此方法可能当然困难或不切实际;但你至少应该考虑它)。

因此下面的一些提示如何提取组数据:

  • 删除所有索引,因为这只会块空间 - 所有你需要做的是一个大的全表扫描

  • 检查每个组的可用空间和大小;也许你可以一次

  • 部署并行查询

处理若干组。

create table tmp as 
select /*+ parallel(4) */ * from BIG_TABLE 
where group_id in (..list of groupIds..); 

请注意,必须在数据库中启用并行模式,如果您不确定,请咨询您的DBA。重点是大型FULL TABLE SCAN由几个子过程(这里是4)执行,这可能(取决于你的里程数)缩短了经过的时间。

+0

谢谢Marmite。我已经测试过你的第一种方法,它“容易得多,但不幸的是,我没有太多的空间来做这件事,每周都会创建所有的组。为一个选定的组创建一周将花费大约1分钟,而我有104周,这意味着1小时半(我正在创建一个进程,允许运行的时间不会超过36小时)至于第二种方法,它是值得仔细考虑,我必须明天测试以检查性能 –

+0

祝你好运,让我们知道我们是否可以提供帮助。 –