Oracle
 sql >> база данни >  >> RDS >> Oracle

Най-бързият начин за извършване на сравнения на полета в една и съща таблица с големи количества данни в Oracle

Първо, вярвам, че вашата задача може да бъде изпълнена (и трябва да бъде действително) с обикновен SQL. Без фантастични курсори, без цикли, само избира, вмъква и актуализира. Бих започнал с премахване на завъртането на вашите изходни данни (не е ясно дали имате първичен ключ за свързване на два набора, предполагам, че имате):

Col0_PK    Col1    Col2    Col3    Col4
----------------------------------------
Row1_val   A       B       C       D
Row2_val   E       F       G       H

По-горе са вашите изходни данни. Използване на UNPIVOT клауза ние го преобразуваме в:

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

Мисля, че схващате идеята. Да кажем, че имаме таблица1 с един набор от данни и същата структурирана таблица2 с втория набор от данни. Добра идея е да използвате организирани по индекс таблици.

Следващата стъпка е сравняването на редовете един с друг и съхраняването на подробности за разликата. Нещо като:

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');

И на последната стъпка актуализираме обобщената таблица на разликите:

insert into diff_summary(summary_columns_here)
 select diff_row_id, count(*) as diff_count
  from diff_details
 group by diff_row_id;

Това е само груба чернова, за да покажа моя подход, сигурен съм, че трябва да се вземат предвид много повече подробности. За да обобщя, предлагам две неща:

  1. UNPIVOT данни
  2. Използвайте SQL изрази вместо курсори


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Dev 4.2 Топ SQL

  2. Oracle кумулативен брой с помощта на SYS_CONNECT_BY_PATH

  3. Изпълнение на незабавна промяна на променливата за свързване на потребителя

  4. Използване на обхват на транзакция и заявки

  5. Първи две заплати във всеки отдел