遍历记录到大表的列+8亿条记录

时间:2016-09-02 04:13:48

标签: oracle oracle11gr2

如何将记录(实际上是列的一个子集)遍历到一个记录列中 - 最多99列 - 用于一个巨大的表?

我的意思是,我有一个包含以下样本结构/数据的表格:

TABLE_ORI
COLUMN1 COLUMN2 COLUMN3 CODE VALUE
------- ------- ------- ---- ------------
C1      C2      C3      1    Value1
C1      C2      C3      2    Value2
C1      C2      C3      3    Value3
C100    C39     C21     1    Value40
C100    C39     C21     2    Value41

我想将此数据转换为:

TABLE_NEW
COLUMN1 COLUMN2 COLUMN3 VALUE1  VALUE2 VALUE3  VALUE4 VALUE5 ... VALUE99
------- ------- ------- ------  ------ ------- ------ ------     -------
C1      C2      C3      Value1  Value2 Value3
C100    C39     C21     Value40 Value41

请考虑这是一个大表,结果表最多可包含99个值列。除了批量收集游标之外,我尝试了带嵌套循环的PL / SQL,但这个过程需要数天而且永远不会结束。 非常感谢!

1 个答案:

答案 0 :(得分:0)

这可能是最快的方式:

create table table_new as
select /*+ parallel */ column1, column2, column3,
    max(case when code = 1 then value else null end) value1,
    max(case when code = 2 then value else null end) value2,
    max(case when code = 3 then value else null end) value3,
    max(case when code = 4 then value else null end) value4,
    max(case when code = 5 then value else null end) value5,
    --...
    max(case when code = 99 then value else null end) value99
from table_ori
group by column1, column2, column3;

假设您拥有Enterprise Edition,一个配置为正确使用并行性的数据库,一次用于对所有数据进行排序的大量表空间等。

在创建表时,使用选项NOLOGGING也有助于提高性能。这样可以避免产生大量的REDO和UNDO,尽管代价是不可恢复的。

对于像这样的大型进程,Real-Time SQL Monitoring是诊断问题的最佳方式。如果上面的SQL需要很长时间,请运行这样的语句来监视SQL并查看占用最多时间的操作和事件:

select dbms_sqltune.report_sql_monitor('$the_real_sql_id') from dual;