将记录遍历为巨大表的列+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;
如何将记录(实际上是列的子集)遍历到单记录列 - 最多 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;