如何将记录(实际上是列的一个子集)遍历到一个记录列中 - 最多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,但这个过程需要数天而且永远不会结束。 非常感谢!
答案 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;