Der Grundstein für den Erfolg eines DataWarehouses wird bereits beim Design gelegt!


Durch konsequente Einhaltung von Codestandards und optimalen Design kann auf Loadspitzen und sich ändernde Anforderungen flexible reagiert werden - oft ohne zusätzliche Hardwareresourcen.


Der Ladeprozess

Zum Laden von Daten im Allgemeinen der SQL-Loader von Oracle verwendet, der sich durch Flelixibilität und einfache Handhabung auszeichnet. Ein wesentlicher Vorteil des Loaders ist es, das Daten über sql/net geladen werden können.

Eine höhere Ladeperformance und Integration in den Transformationsprozess ereicht man durch die verwendung von externen Tabellen. Der Loader kann aus dem ctl-Script das ddl der externen Tabelle erstellen. Die so erstellten externen Tabellen können im darauf folgenden Transformationsprozess wie 'normale' Oracle Tabellen in select - Statements genutzt werden.

sqlldr 
  user_id/password 
  control=control.ctl 
  log=table_load.log 
  external_table=generate_only

Der Transformationsprozess

Hier gibt Oracle eine Vielzahl von Möglichkeiten, bei komplexeren Transformationen sollten Table Functions genutzt werden. So kann die Transformation der Daten aus der externen Tabelle 'some_talbe' über die Funktion my_table_function erfolgen. Das Ergebnis des folgende Views wird dann einfach der DB hinzu gefügt.

select * from 
  table (
        my_table_function(
                       CURSOR(select 
                                 field1, field2, field3 
                                FROM 
                                 some_table
                              )
                         )
        );

Update Statements sollten grundsätzlich als 'bulk-update' codiert werden. Im ersten Schritt wird der Update-View definiert:

create view v_upd_table as
 select a.rowid z_rowid, b.new_value
  from
 table_target a, table_source b
 where
  a.pk_column = b.pk_column;

Dieser View wird anschließend in einem Package verwendet, wobei grundsätzlich bulk-update mit 'limit' verwendet werden soll.

declare
     type t_rowid is table of varchar2(18) index by pls_integer;
     type t_new_value is table of v_upd_table.new_value%type index by pls_integer;

     l_t_rowid t_rowid;
     l_t_new_value t_new_value;

     cursor c_upd is 
       select * from v_upd_table;
   
     fetch_limit constant number := 10000;
  
begin
   open c_upd;
  
   loop
     fetch c_upd bulk collect 
        into l_t_rowid, l_t_new_value 
        limit fetch_limit ;

     pkg_common_logging.fetched(c_upd%ROWCOUNT);

   if c_upd%ROWCOUNT > 0 THEN
        forall i in l_t_rowid.first .. l_t_rowid.last
  
      update table_target set
         old_value = l_t_new_value(i)
         WHERE ROWID = CHARTOROWID (l_t_rowid(i));

      commit;

    end if;
   exit when l_t_rowid.count() < fetch_limit;
  
   end loop;
   close c_upd;
 
exception
  when others then
    pkg_common_logging.failed;
    close c_upd;
    raise;

end;