Έχουμε φτάσει στο σημείο που θα πρέπει να γεμίσουμε με δεδομένα τους πίνακες που έχουμε στο DW. Και σε αυτή την φάση υπάρχουν θέματα στα οποία θα πρέπει να πάρω αποφάσεις για αυτά.
Surrogate Keys
Η πρώτη βασική απόφαση είναι για το πώς θα δημιουργώ τα surrogate keys στους πίνακες που έχω τέτοια όπως πχ στους dimension tables. Υπάρχουν δύο βασικές «σχολές».
Η μία λέει ότι αφήνω την βάση να δίνει τιμή σε αυτό με την χρήση identity columns. H συγκεκριμένη «σχολή» έχει σαν πλεονεκτήματα ότι
- δεν δίνει overhead στην διαδικασία ETL καθώς αυτόματα δίνεται τιμή κατά την εισαγωγή νέας έγγραφής από την βάση.
- μπορείς να ελέγξεις από που θα ξεκινάς και πως θα ανεβαίνεις (seed,increment)
- μπορώ να έχω concurrency καθώς με την αυτόματη ανάθεση τιμής σε αυτό από την βάση δεν θα έχω duplicate key values.
Φυσικά υπάρχουν και μειονεκτήματα όπως
- η τιμή στο πεδίο αυτό γίνεται γνωστή αφού έχω εισάγει το record στην βάση, όπως για παράδειγμα όταν εισάγω δεδομένα ταυτόχρονα σε πίνακες με την λογική master-details όπου εκεί πρέπει να γνωρίζω την τιμή αρχικά.
- θα πρέπει να λάβω υπόψη τις ιδιαιτερότητες των @@IDENTITY , SCOPE_IDENTITY() όπου υπάρχει περίπτωση να έχω λάθος επιστροφή τιμών. (ΚΒ 2019779).
- σε περιπτώσεις που έχω μεταφορές δεδομένων μεταξύ πινάκων όπου θέλω να κρατήσω το referential integrity θα πρέπει να κάνω επιπλέον βήματα για διασφαλίσω αυτό όπως για παράδειγμα να ενεργοποιήσω/απενεργοποιώ το IDENTITY_INSERT.
Η άλλη «σχολή» λέει ότι η τιμή στο surrogate key θα γίνεται μέσα από την διαδικασία του ETL, με μια λογική όπου απαιτεί δύο βήματα όπου στο πρώτο βρίσκουμε την επόμενη τιμή και την αποθηκεύουμε σε μια μεταβλητή (συνήθως με ένα Execute SQL Task το οποίο περιέχει ένα query με max aggregation πάνω στον πίνακα εισαγωγής) και το επόμενο βήμα είναι να κάνουμε ανάθεση της τιμής αυτής της μεταβλητής στο key value (συνήθως μέσα από κάποιο Script component).
Τα πλεονεκτήματα της «σχολής» αυτής είναι ότι
- έχουμε τον απόλυτο έλεγχο της τιμής που εισάγετε.
- σε περιπτώσεις μεταφοράς δεδομένων μεταξύ πινάκων δεν ανησυχούμε για το referential integrity.
- δεν εμφανιστούν περιπτώσεις με ενδιάμεσα κενά πχ 1,2,3,7,10,20…
Τα μειονεκτήματα της είναι ότι
- θα πρέπει να αυτή την διαδικασία να την επαναλαμβάνω σε κάθε SSIS Package που χρειάζεται, αυτό βέβαια μπορεί να λυθεί είτε με τη χρήση templates ή το να δημιουργηθεί ένα custom SSIS component.
- δεν είναι εύκολο να έχω σενάριο concurrency καθώς κάνω εισαγωγή στον ίδιο πίνακα με μια λογική single user.
Loading incremental changes
Η επόμενη βασική απόφαση είναι το πώς θα ενημερώνω τους πίνακες που έχω στο DW με τις αλλαγές (insert,update,delete) που τα δεδομένα έχουν υποστεί στις πηγές. Αυτές οι εργασίες μπορεί να είναι απαιτητικές σε πόρους αλλά εκτός από αυτό θα πρέπει να έχω βρει και τον τρόπο με τον οποίο θα αντιδρώ σε περιπτώσεις που υπάρχει κάποιο failure στην διαδικασία και θα πρέπει να εκτελεστεί ξανά η διαδικασία του ETL.
Βασικά απλά πράγματα θα πρέπει να υλοποιηθούν όπως να είναι transactional η όλη διαδικασία σαν batch και όχι row by row τόσο για τα inserts όσο και για τα updates και deletes. Επειδή δεν υπάρχει κάποιο SSIS task ή component με το οποίο μπορώ να έχω αυτό (batch) μια τεχνική είναι να έχω προσωρινό πίνακα με όλα τις αλλαγές και να κάνω χρήση της MERGE που υπάρχει στην Τ-SQL
Επίσης θα πρέπει να βρω το πως θα έχω το καλύτερο performance και τι με συμφέρει ανά περίπτωση να χρησιμοποιήσω για το επιτύχω αυτό πχ θα χρησιμοποιήσω SSIS OLEDB destination, θα χρησιμοποιήσω BULK INSERT task ή to bcp utility.
Θα πρέπει να δώσω προσοχή στην σειρά που θα ενημερώνω τους πίνακες μέσα στο DW καθώς είναι σίγουρο ότι μεταξύ τους υπάρχει referential integrity. Έτσι για παράδειγμα θα πρέπει να ενημερώνω πρώτα τα dimension tables και μετά τα facts.
Βαρύτητα θα πρέπει να δοθεί στην ιστορικότητα που πρέπει να έχω, ιδιαίτερα στους dimension tables (
Slowly Changed Dimension). Θα πρέπει να επιλέξω έναν από τους τρεις τύπους που ο εφευρέτης τους (R. Kimball) έχει ορίσει.
Τέλος θα πρέπει να βρω τον τρόπο με τον οποίο θα έχω το βέλτιστο lookup για τον εντοπισμό των records που έχουμε στο DW σε σχέση με την πηγή. Για αυτό θα πρέπει να εξοικειωθώ με την χρήση του SSIS Lookup Transformation.
Επίλογος
Με αυτό το post κλείνω την σειρά των post που είχαν να κάνουμε με το τι πρέπει να προσέξω κατά την υλοποίηση ενός ETL. Θεωρώ ότι ήταν πράγματα τα οποία έπρεπε να γραφτούν καθώς είναι σημεία τα οποία θα έχουν αντίκτυπο στην υλοποίηση πράγμα που κανείς μας δεν θέλει καθώς είναι κουραστικό να κυνηγάς την ουρά σου που σαν άνθρωπος δεν έχεις.
Θα συνεχίσω όμως την σειρά των BI posts καθώς είναι από τα αγαπημένα μου θέματα, αλλά πρώτα να είμαστε όλοι μας καλά στην υγεία μας.
/*antonch*/