2016-09-02 8 views
0

レコード(実際には列のサブセット)を1レコードの列(最大99列)にトラバースするにはどうすればよいでしょうか?これは大きなテーブルと結果テーブルであるとお考えください巨大なテーブルの列へのレコードの移動+800百万のレコード

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

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 

は、私はにこのデータを変換したい:私は意味

は、私は、次のサンプル構造/データを持つテーブルを持っています最大99の列を持つことができます。私は大量のカーソルを収集する以外にネストされたループを持つPL/SQLを試しましたが、処理には数日かかります。 ありがとう!

+1

は、あなたが本当に唯一たいですか:上記のSQLは長い時間がかかっている場合は、SQLを監視し、操作やイベントはほとんどの時間を取っているかを確認するには、このようなステートメントを実行します、またはこれ以上がある可能性がありますか? –

+0

実際には99の可能な値があります。 – Osy

答えて

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は問題を診断するのに最適な方法です。 3つの値列に旋回結果に

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

Jon、すべてのレコードが選択されます。最終結果は新しいテーブルです – Osy

関連する問題