将记录遍历为巨大表的列+8亿条记录

Traverse records into columns for huge tables +800 million records

如何将记录(实际上是列的子集)遍历到单记录列 - 最多 99 列 - 对于巨大的 table?

我的意思是,我有一个 table 和以下示例 structure/data :

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

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

这可能是最快的方法:

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;

假定您拥有企业版、配置为正确使用并行性的数据库、大量table空间来一次对所有数据进行排序,等等。

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

对于像这样的大型流程,实时 SQL 监控是诊断问题的完美方式。如果上面的 SQL 花费了很长时间,运行 这样的语句来监视 SQL 并查看哪些操作和事件占用的时间最多:

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