2016-09-02 3 views
0

Как я могу перемещать записи (на самом деле подмножество столбцов) в столбцы с одной записью - до 99 столбцов - для огромной таблицы?Перемещение записей в столбцы для огромных таблиц +800 миллионов записей

Я имею в виду, у меня есть таблица со следующей структурой выборки/данные:

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

Вы действительно только хотите 3 значений столбцов в поворотном результате , или может быть больше этого? –

+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, хотя за счет того, что таблица не может быть возмещена.

Для больших процессов, подобных этому, мониторинг в реальном времени SQL является идеальным способом диагностики проблем. Если выше SQL занимает много времени, запустить подобное заявление, чтобы контролировать SQL и посмотреть, какие операции и события, которые занимают большую часть времени:

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

Jon, все записи будут выбраны. Конечным результатом является новая таблица – Osy

Смежные вопросы