Hallo Tweakers,
Voor mijn stage ben ik een kritische blik aan het werpen op een datawarehouse. Kort samengevat performt het datawarehouse gewoon niet, en daar zijn workarounds omheen gebouwd om het toch werkbaar te houden. (Oorspronkelijke idee was alles rechtstreeks te bekijken via views, dat werd zo traag dat ze nu elke nacht een mega-view dumpen in een tabel en op die tabel dan weer views hebben geschreven).
Goed, ik heb de query execution paths bekeken en het valt me op dat er veel tijd verloren gaat met het sorteren van (tussen)-resultaten. Doorredenerend bleken alle tabellen ongeïndexeerd. Als reactie op mijn vraag waarom dat eigenlijk zo is, kreeg ik te horen dat als ze de tabellen zouden indexeren, de (ook) dagelijkse export uit het ERP-systeem te lang zou duren.
De dagelijkse export uit dat ERP systeem is waar mijn vraag betrekking op heeft. Dat zou te lang gaan duren met indexering omdat ze elke nacht alle tabellen leegmaken en dan weer opnieuw vullen met alle data uit het ERP-pakket. Omdat de tabel leeggemaakt wordt gaat ook de bestaande index verloren, en het elke nacht opnieuw opbouwen van die index kost blijkbaar te veel tijd.
Ik vraag me dan af of dit inderdaad de gangbare manier is om een ERP-systeem in een SQL-database te exporteren. Vanuit mijn begninersperspectief lijkt het veel logischer om de tabellen van de vorige dag níet te droppen, maar enkel aan te vullen met de nieuwe records. Daarbij moeten dan wel ook alle bestaande records aangepast worden als er zich die dag wjizigingen in zo'n record hebben voorgedaan. Een soort kopiëeren waarbij al bestaande identieke records overgeslagen worden.
Ik heb al flink gegoogled, maar kan geen werkwijze vinden om in SQL bovenstaande mogelijk te maken. Daarom uiteindelijk toch maar een topic geopend hier. Ik hoop dat iemand me kan vertellen wat de gangbare manier is om zo'n export dagelijks te doen om het datawarehouse up-to-date te houden, en of het wel/niet mogelijk is om enkel gewijzigde records te updaten, in plaats van de hele tabel opnieuw te vullen.
Edit: Soms is de oplossing zo simpel dat je hem over het hoofd ziet. Volgens mij zou je hiermee eenvoudig de nachtelijke import zo kunnen neerzetten dat hij incrementeel werkt.
update my_table set
my_col1 = 'newValue1',
my_col2 = 'newValue2'
where id = 'someKey'
and (my_col1 != 'newValue1'
or my_col2 != 'newValue2'); --> Slecht idee
Voor mijn stage ben ik een kritische blik aan het werpen op een datawarehouse. Kort samengevat performt het datawarehouse gewoon niet, en daar zijn workarounds omheen gebouwd om het toch werkbaar te houden. (Oorspronkelijke idee was alles rechtstreeks te bekijken via views, dat werd zo traag dat ze nu elke nacht een mega-view dumpen in een tabel en op die tabel dan weer views hebben geschreven).
Goed, ik heb de query execution paths bekeken en het valt me op dat er veel tijd verloren gaat met het sorteren van (tussen)-resultaten. Doorredenerend bleken alle tabellen ongeïndexeerd. Als reactie op mijn vraag waarom dat eigenlijk zo is, kreeg ik te horen dat als ze de tabellen zouden indexeren, de (ook) dagelijkse export uit het ERP-systeem te lang zou duren.
De dagelijkse export uit dat ERP systeem is waar mijn vraag betrekking op heeft. Dat zou te lang gaan duren met indexering omdat ze elke nacht alle tabellen leegmaken en dan weer opnieuw vullen met alle data uit het ERP-pakket. Omdat de tabel leeggemaakt wordt gaat ook de bestaande index verloren, en het elke nacht opnieuw opbouwen van die index kost blijkbaar te veel tijd.
Ik vraag me dan af of dit inderdaad de gangbare manier is om een ERP-systeem in een SQL-database te exporteren. Vanuit mijn begninersperspectief lijkt het veel logischer om de tabellen van de vorige dag níet te droppen, maar enkel aan te vullen met de nieuwe records. Daarbij moeten dan wel ook alle bestaande records aangepast worden als er zich die dag wjizigingen in zo'n record hebben voorgedaan. Een soort kopiëeren waarbij al bestaande identieke records overgeslagen worden.
Ik heb al flink gegoogled, maar kan geen werkwijze vinden om in SQL bovenstaande mogelijk te maken. Daarom uiteindelijk toch maar een topic geopend hier. Ik hoop dat iemand me kan vertellen wat de gangbare manier is om zo'n export dagelijks te doen om het datawarehouse up-to-date te houden, en of het wel/niet mogelijk is om enkel gewijzigde records te updaten, in plaats van de hele tabel opnieuw te vullen.
Edit: Soms is de oplossing zo simpel dat je hem over het hoofd ziet. Volgens mij zou je hiermee eenvoudig de nachtelijke import zo kunnen neerzetten dat hij incrementeel werkt.
update my_table set
my_col1 = 'newValue1',
my_col2 = 'newValue2'
where id = 'someKey'
and (my_col1 != 'newValue1'
or my_col2 != 'newValue2'); --> Slecht idee
[ Voor 7% gewijzigd door Torrentus op 11-12-2014 09:25 ]