эффективная вставка в SCD type 2

Alexus12
Дата: 28.11.2012 16:44:29
есть таблица - SCD type 2 (http://en.wikipedia.org/wiki/Slowly_changing_dimension)

вида

create table Agrs_table 
(
    agreement_ID    Number,
    start_date     Date,
    end_date Date,
...прочие поля
)


с заполнением в несколько шагов:
1) сначала в таблицу вставляются новые записи
2) затем у всех затронутых изменением записей меняется end_date

заполнение End_Date "бесконечной датой" производится таким кодом:

  procedure EndDate
  is
    var_agreement_ID    dbms_sql.Number_Table;
    var_start_date     dbms_sql.Date_Table;
    var_end_date dbms_sql.Date_Table;
    var_cursor          ref cursor;
    var_rowcount        int;
  begin
    open var_cursor for
      select agreement_ID,
             start_date,
             lead(start_date - 1, 1, date '2100-12-31') over(partition by agreement_ID order by start_date) as end_date
        from (select distinct agreement_ID, start_date
                from Agrs_table)
       order by agreement_ID;

    loop
      fetch var_cursor bulk collect
        into var_agreement_ID, var_start_date, var_end_date limit 50000;
      exit when var_agreement_ID.first is null;

     forall i in var_agreement_ID.first .. var_agreement_ID.last
        update Agrs_table
           set end_date = var_end_date(i)
         where agreement_ID = var_agreement_ID(i)
           and start_date = var_start_date(i)
           and end_date != var_end_date(i);

    end loop;


    close var_cursor;
  end;


есть ли вы более эффективное решение?

например, это http://www.business-intelligence-quotient.com/?p=66. лучше уже тем, что производится один скан участвующих таблиц и одно изменение в них в разрезе затронутых строк одновременно, а не 2 раза подряд?
juras
Дата: 28.11.2012 19:15:04
Alexus12,

Привет,

как Вы определяете (конструируете) INUP курсор?

Мы, например, имеем для каждой СЦД2 свое представление, в котором уже определено, как работать со строкой.
Превдставление конструируется следующим образом:

<target> full outer join <source> where target.key = source.key
где <source> это актуальный срез SCD2.
Потом, анализируя данные, получим
INS, new_key, ...
UPD, old_key, ...
DEL, old_key, ...
все в одном курсоре.

Потом, однопроходной мердж в target

Ю.
SY
Дата: 28.11.2012 19:32:07
Alexus12,

Тынц.

SY.
Alexus12
Дата: 29.11.2012 13:04:22
SY, спасибо!
задал вопрос в той же теме, прошу посмотреть