J'ai 2 types de tables pour peupler le warehouse de données avec tous les jours, des tables de recherche ou des tables de configuration avec quelques enregistrements 100, et c'est facile où je viens de tronquer et de remplir la table.
mais pour les tables de transaction, cela possède de nombreux enregistrements, j'y incréments habituellement, c'est-à-dire que je gère l'ETL quotidiennement pour ajouter des enregistrements d'hier.
j'ai 2 problèmes que je veux toujours
maintenant, j'essaie de concevoir une manière que je vienne ces 2 problèmes et j'essaie de développer l'ETL de manière à pouvoir réparer automatiquement l'auto-incasque l'un de ces événements.
je veux que cela vérifie s'il manque des journées manquantes et courez gérer l'ETL pendant ce jour et vérifiez s'il y a des duplicats et les supprimez.
vous trouverez ci-dessous des façons de 1. je prends au cours des 5 derniers jours, peu importe, chaque jour, l'ETL fonctionne, supprime les 5 derniers jours et recharge. 2. Je vérifie les tables de destination si elles ont des dates manquantes au cours du dernier mois, puis je interrogeons la source avec les journées manquantes.
en gardant à l'esprit que la source est une énorme table dans un environnement de production que je dois optimiser ma requête au maximum lors de la demande.
merci
Les transactions ont-elles un horodatage d'audit? Ce doit être celui qui ne monte que (pas de faits arrivants en retard. Insérer/mettre à jour les horodatages d'audit sont bons pour cela)
[.____] Si vous pouvez l'utiliser pour définir une plage à extraire. C'est une technique courante pour ce type de chose:
select * from where ts > min_ts and ts <= max_ts
) ou en morceaux si nécessaire.comment déterminer min_ts et max_ts?
Vous pouvez prendre min_ts de l'extraction_log, en utilisant le dernier succès max_ts. select max(max_ts) from extraction_log where status = 'Finished OK'
Vous pouvez prendre max_ts de la DB source au début de votre extraction. select max(audit_ts) from source_table
Il y a des alternatives ici. Si vous les extrayez dans une table de mise en scène temporaire (une meilleure pratique), vous pouvez également prendre trop, c'est-à-dire les 5 derniers jours et traiter des doublons plus tard lors de la mise en place des entrées de votre SAO. Pour max_ts, si vous êtes absolument certain que les horloges entre votre DWH et la source sont et resteront en synchronisation (il s'agit d'une hypothèse très dangereuse - non recommandée), vous pouvez même utiliser sysdate ()
Techniquement, vous pouvez vous échapper avec moins d'effort. Vous n'avez pas vraiment besoin des statuts ou d'une table extraction_log qui garde une trace de chaque lot. Mais j'ai trouvé que cela aime que cela aide beaucoup avec le débogage et le dépannage plus tard. De plus, si vous avez besoin d'une routine pour supprimer les entrées d'une charge qui a échoué à mi-chemin, de trouver des lacunes pour des gammes d'extractions passées, etc., l'extraction_log vous aidera. Vous voudrez peut-être même inclure l'extraction_id comme une colonne supplémentaire dans votre SAO.
quelques pensées supplémentaires
si vous n'avez pas de bon candidat à horodatage, une clé technique du système source avec les mêmes propriétés (doit augmenter uniquement, aucun faits arrivant en retard) devrait aussi bien.
si les horodaques sont générées par l'application source et que 2 transactions avec exactement le même horodatage ne sont pas insérées en même temps (assez courantes), il est donc plus sûr d'utiliser un max_ts légèrement dans le passé (select max(max_ts) - 5 minutes from source_table.
)
concernant les charges infructueuses. Si vous ne préoccupez que de nettoyer les entrées des dernières charges ayant échoué, vous pouvez l'ajouter comme première étape de votre flux ETL. (delete from dwh_table where ts > min_ts
) Cela supprimera les entrées de tout échec (le cas échéant) après la dernière extraction réussie. Il ne traitera pas de défaillances entre des extractions réussies antérieures.
Pourriez-vous ajouter une table supplémentaire à l'entrepôt de données utilisé pour maintenir vos tables de transaction importées?
La table de maintenance pourrait être appelée quelque chose comme:
ImportJob
ImportID (primary key)
TransactionDate
Ajoutez la colonne Importé aux tables de transaction et définissez ceci lors du chargement des données.
Le tableau d'importation aurait un enregistrement pour chaque jour d'une valeur de transactions importées. Une contrainte unique sur la transactionDate empêcherait de recharger les données deux fois. Vous auriez également un moyen rapide de supprimer des transactions avec atomicité si l'import échoue. Vous pouvez interroger les tables de production pour une journée de données à la fois et remplir les journées manquantes.
D'accord, cela va être une sorte de version de base de ce que vous devez d'abord devoir être de faire une table de contrôle. Cela contrôlera essentiellement l'ETL que vous faites. Dans ce tableau, une des choses que vous voudrez stocker la dernière fois que le processus a couru correctement. Maintenant, lorsque vous faites votre ETL, vous pouvez appeler à cette table pour trouver la plage de date que vous recherchez essentiellement toutes les lignes > LastSuccesfullRun
La prochaine chose que vous voulez faire pour prévenir les doublons est également assez simple. Prenez d'abord votre tâche de flux de données qui a maintenant été filtrée par plage de dates en fonction de la dernière exécution réussie. Utilisez ensuite un composant de recherche pour comparer contre les rowset que vous avez actuellement dans la table. En cas de match, ne rien faire sur aucun insert de match. Attaché ci-dessous est une démo pour cela.
J'aimerais aller dans plus de détails mais je ne sais pas assez sur votre processus ETL pour donner plus de conseils.
On dirait que vous êtes capable de traiter chaque jour des enregistrements comme une unité discrète. J'essaierais:
where transactiondate >= @missingdate and transactiondate < dateadd(day,1,@missingdate)
Donc, si le travail fonctionne après avoir manqué un jour ou deux, il interrogera la production séparément pour chaque jour, mais il ne devrait pas gaspiller aucune ressource tirer des enregistrements que le DW a déjà. Si le travail est exécuté plusieurs fois en une journée, il ne faut même pas finir par exécuter une requête contre la production, à moins d'une journée qui n'avait aucune transaction (par exemple une fête).
Vous voudrez peut-être limiter les gammes de date au n ° 1 ci-dessus au cours des 5 derniers jours, 30 jours ou ce qui est logique.
La faiblesse de cette approche est que la liste de date ne peut contenir les dates actuelles ou futures et qu'il n'existait aucune provision pour des mises à jour ni de nouveaux enregistrements pour une date qui a déjà été copiée dans le DW, mais pour vos transactions connectées, cela ressemble à cela peut être acceptable.