Der Grundstein für den Erfolg eines Data Warehouses 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_onlyDer 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;