Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Maneira mais rápida de fazer comparações de campos na mesma tabela com grandes quantidades de dados no oracle


Em primeiro lugar, acredito que sua tarefa pode ser implementada (e deve ser realmente) com SQL staight. Sem cursores sofisticados, sem loops, apenas seleciona, insere e atualiza. Eu começaria desarticulando seus dados de origem (não está claro se você tem chave primária para unir dois conjuntos, acho que sim):
Col0_PK    Col1    Col2    Col3    Col4
----------------------------------------
Row1_val   A       B       C       D
Row2_val   E       F       G       H

Acima estão seus dados de origem. Usando UNPIVOT cláusula convertemos para:
Col0_PK     Col_Name    Col_Value
------------------------------
Row1_val    Col1        A
Row1_val    Col2        B
Row1_val    Col3        C
Row1_val    Col4        D
Row2_val    Col1        E
Row2_val    Col2        F
Row2_val    Col3        G
Row2_val    Col4        H

Acho que você entendeu a ideia. Digamos que temos a tabela1 com um conjunto de dados e a mesma tabela estruturada2 com o segundo conjunto de dados. É uma boa ideia usar tabelas organizadas por índice.

A próxima etapa é comparar as linhas entre si e armazenar os detalhes das diferenças. Algo como:
insert into diff_details(some_service_info_columns_here)
 select some_service_info_columns_here_along_with_data_difference
  from table1 t1 inner join table2 t2
     on t1.Col0_PK = t2.Col0_PK
    and t1.Col_name = t2.Col_name
    and nvl(t1.Col_value, 'Dummy1') <> nvl(t2.Col_value, 'Dummy2');

E na última etapa, atualizamos a tabela de resumo de diferenças:
insert into diff_summary(summary_columns_here)
 select diff_row_id, count(*) as diff_count
  from diff_details
 group by diff_row_id;

É apenas um rascunho para mostrar minha abordagem, tenho certeza de que há muito mais detalhes a serem levados em consideração. Para resumir, sugiro duas coisas:
  1. UNPIVOT dados
  2. Usar SQL instruções em vez de cursores