Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Create Relational Schema – Incremental Mode und nun?

Aufbauend auf dem Blogbeitrag im Mai 2019 wird in diesem Artikel eine Prozedur vorgestellt, die nach einem „Create Relational Schema – incremental mode“ nicht nur die betroffenen Tabellen ermittelt und die erforderlichen Prozeduren zum inkrementellen Befüllen der betroffenen Tabellen bereitstellt, sondern diese bei Bedarf auch automatisch ausführt. Alternativ wird eine View zur Verfügung gestellt, mit welcher die entsprechenden Tabellen und Prozeduren vor der Ausführung des incremental mode ermittelt werden können.

Inkrementelles Create Relational Schema

DeltaMaster ETL stellt für den Aufbau des relationalen Tabellenschemas verschiedene Optionen bereit. Bei neuen Modellen wird man sich immer für die Option „Full Mode“ entscheiden. Auch bei umfangreichen Änderungen an einem bestehenden Modell oder Änderungen an einer an alle Faktentabellen angebundenen Dimension wie z. B. der Periodendimension wird man „Full Mode“ verwenden. Denn in diesem Fall werden alle Dimensions- und Faktentabellen sowie die Prozeduren zum Befüllen der Tabellen neu erstellt.

Werden allerdings nur wenige Dimensions- und/oder Faktentabellen geändert – sei es, dass ein Attribut bei einer Dimension hinzugefügt oder entfernt wird oder Kennzahlen in das Modell aufgenommen werden – besteht der Bedarf für die Option „Full Mode“ nicht. In diesem Fall bietet sich die Option „Incremental Mode: changed and dependant tables, all views and all procs“ an:

2019-12-30_crew_DeltaMaster ETL Auswahl Create OptionAbbildung 1 DeltaMaster ETL Auswahl Create Option

Diese Option bietet den Vorteil, dass nur die Dimensions- und Faktentabellen neu erstellt werden, an denen Änderungen vorgenommen wurden oder die von den geänderten Tabellen abhängig sind. Deshalb ist in diesem Fall auch nur das Befüllen dieser Tabellen notwendig. Ein komplettes Transform_All wäre bei vielen Modellen auch zu zeitaufwändig.

Wie bereits in dem im Abstract genannten Beitrag von Herrn Grund beschrieben, wird an dieser Stelle (noch) nicht angezeigt, welche Tabellen nun tatsächlich gelöscht und neu erstellt wurden. Daher ist es einigermaßen mühsam sich die Abhängigkeiten selbst zusammenzusuchen.

Inkrementelles Laden

Die View V_APP_incrCS_Affected_Tables_Procs trägt die neuen und daher leeren Tabellen und die Prozeduren zu deren Befüllung zusammen. Mit der Prozedur P_APP_IncrCS_Fill_Tables können diese Prozeduren auf Wunsch auch sofort ausgeführt oder als ausführbares Statement ausgegeben werden. View und Prozedur sind im Anhang beigefügt. Da die Prozedur auf die View zurückgreift, kann die Prozedur nicht ohne die genannte View installiert und ausgeführt werden.

Wer bereits vor Ausführung des Create Relational Schema (incremental mode) wissen möchte, welche Dimensions- und Faktentabellen voraussichtlich betroffen sein werden, kann auf die ebenfalls im Anhang gespeicherte View V_APP_IncrCS_Affected_Tables_only zurückgreifen. Diese View gibt nach den Änderungen am Modell über „DeltaMaster ETL.das“ die vom nächsten Create Relational Schema betroffenen Tabellen namentlich zurück. In dieser View wird kein Ausführungsskript zur Befüllung der Tabellen erstellt.

Technik – verwendete Tabellen und Sichten

Für interessierte Leser sei an dieser Stelle kurz erwähnt, welche Tabellen und Sichten für die Prozedur bzw. die beiden Views verwendet werden.

Die View V_APP_IncrCS_Affected_Tables_only greift auf die Sicht V_MODELSYS_CreateSnowflakeModelObject zurück. In der Spalte IncludeInNextCS werden die Dimensionen und Faktentabellen gekennzeichnet, welche von den im Modell getätigten Änderungen betroffen sind.

Die Ausführung des SQL-Statements liefert die hier bereits gekennzeichneten Objekte.

SELECT DISTINCT
       cso.CSBaseObjName
FROM dbo.V_MODELSYS_CreateSnowflakeModelObject cso
WHERE IncludeInNextCS > 0

Nach Ausführung des Create Relational Schema können die Ausführungsergebnisse aus der Tabelle T_SYSLOG_CreateSnowflakeID ermittelt werden. In der CSID werden die durchgeführten Create Relational Schema mit einer fortlaufenden Nummer versehen. Will man sich also das aktuelle und damit letzte Ergebnis ansehen, muss man die letzte, maximale CSID ermitteln:

SELECT
       MAX(cs.CSID) AS Mcsid
FROM dbo.T_SYSLOG_CreateSnowflakeID cs

INNER JOIN dbo.T_SYSLOG_CreateSnowflakeID csf ON csf.CSID = cs.CSID AND csf.CSSuccessful = 1 AND csf.CSMode = 1

Die Tabelle T_SYSLOG_CreateSnowflakeID enthält zu jeder CSID u.a. die Informationen, welche Option beim Create Relational Schema verwendet wurde und ob der Prozess erfolgreich war. Beide Informationen liegen als IDs vor, wobei bei der Option (Spalte „CSMode“) eine „2“ für Full Mode steht und eine „1“ für Incremental mode. Ob das Create Relational Schema erfolgreich ausgeführt wurde, findet sich in der Spalte „CSSuccesful“ – hier steht eine „1“ für erfolgreich, eine „0“ zeigt an, dass der Prozess nicht erfolgreich abgeschlossen wurde.

Da alle Tabellen und Sichten, welche „Model“ bzw. „MODELSYS“ enthalten, im Datenbankschema „dbo“ angelegt werden, wird hier fest dieses Datenbankschema verwendet.

Die Tabellen und Prozeduren können aus den Sichten dbo.V_Model_CreateDimProcs und dbo.V_Model_CreateFactProcs ermittelt werden. Die Information, ob die entsprechenden Tabellen neu angelegt wurden und daher leer sind, findet sich in der Sicht dbo.V_MODELSYS_CreateSnowflakeCode in der Spalte CSCmdExecutionState. Da nur das Erzeugen der Tabellen an dieser Stelle von Interesse ist, wird die Spalte CSCmdOrigin auf „Create_Dim_Tables“ bzw. „Create_Fact_Tables“ abgefragt und der CSObjType auf „DIMLVL_TAB“ für die Dimensionstabellen und „FACT_TAB“ für die Faktentabellen festgelegt:

SELECT DISTINCT
       csc.CSID
       , csc.CSObjName AS TableName
       , dp.DimensionLevelProcName AS ProcName
FROM
       dbo.V_MODELSYS_CreateSnowflakeCode csc 
       LEFT JOIN dbo.V_Model_CreateDimProcs dp ON dp.DimLevelRowID = csc.ModelRowID
WHERE 
       csc.CSObjType = 'DIMLVL_TAB'
       AND ISNULL(CSCmdExecutionState,0) = 1

UNION ALL
SELECT DISTINCT
             csc.CSID
             , csc.CSObjName AS TableName
             , dp.FactProcName AS ProcName
FROM dbo.V_MODELSYS_CreateSnowflakeCode csc
       LEFT JOIN dbo.V_Model_CreateFactProcs dp ON dp.FactRowID = csc.ModelRowID
WHERE 
       csc.CSObjType = 'FACT_TAB'

       AND ISNULL(CSCmdExecutionState,0) = 1

Mit dem Paramater @ExecuteProc kann gesteuert werden, ob die Prozedur P_APP_IncrCS_Fill_Tables sofort ausgeführt werden soll oder ob lediglich das ausführbare SQL-Statement in der Variable @ExecuteSQL zurückgeliefert werden soll.

@ExecuteProc = 0: Prozeduren zum Befüllen der Tabellen werden ausgeführt

@ExecuteProc = 1: ausführbares SQL-Statement zum Befüllen der Tabellen wird zurückgeliefert

Auf eine Fehlerprüfung und Fehlerausgabe beim Befüllen der Tabellen wurde in dieser Prozedur verzichtet. Wer dies benötigt, dem sei die Prozedur aus dem in der Einleitung genannten Beitrag empfohlen.

Fazit

Ein inkrementelles Create Relational Schema kann durch inkrementelles Laden der betroffenen Tabellen sinnvoll ergänzt werden. Bis dies wie bereits geplant in den Funktionsumfang von DeltaMaster ETL integriert ist, kann die vorgestellte Prozedur vielleicht hilfreich sein.