Bonjour,
Ca fait plusieurs jours que je me casse la tête sur le probleme suivant:
J'ai 4 tables:
1. une grosse table de fait qui contient des données numeriques par site de production (envion 100 000 differents).
Cette table, contient comme champs: l'id du site, la date des valeurs, la date d'insertion, et un multitudes de mesures (quantité produite, prix, etc.)
2. une deuxieme table qui contient les mêmes champs mais aggrégés a la semaine et non plus au jour.
3. une table de status, qui stocke entre autres, la date de derniere execution du script qui mets a jour la table aggregée.
4. une table date, qui stocke la date, la semaine de l'année, l'année, etc.
Mais 4 tables sont donc:
1. FACT (fact_pk, site_fk, date_fk, insert_date, champ1, champ2, etc)
2. FACT_AGG (fact_agg_pk, site_id, date_week_id, insert_date, champ_agg1, champ_agg2, etc)
3. STATUS (status_pk, last_agg_update) cette table contient une seule ligne.
4. DATE (date_pk, week_nb, year_nb, et)
Chaque jour des nouvelles entrées sont inserées dans la table fait. Mais aussi certaines entrées précédentes sont corrigées.
Je dois ensuite aggreger ces nouvelles données et corriger les anciennes données deja aggregées.
Recaculer entierement la table (80 millions!) c'est pas envisageable, ca prends trop de temps,
alors je dois identifier les "nouvelles" données et ensuite les aggreger, pour ensuite faire un insert ou update dans ma table aggreegée.
J'ai donc quelque chose qui ressemble a ceci:
Il me semble que le morceau qui coince c'est ce select:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Select fact.site_id, date.week_nb, aggregate(champ1) as champ_agg1, aggregate(champ2) as champ_agg2, (...) FROM FACT, DATE WHERE DATE.DATE_PK = FACT.DATE_FK AND FACT.SITE_id in (select distinct(SITE_id) from FACT where insert_date > (select last_agg_update from STATUS) GROUP BY fact.site_id, date.week_nb
Voila. J'ai pensé a partitionner ma table, selon le week_nb (et donc que j'ajouterais comme champ supplémentaire a niveau de la table FACT), il y a 4 ans d'histoire donc ca ferait 250 partitions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select distinct(SITE_FK) from FACT where insert_date > (select last_agg_update from STATUS)
Mais le souci c'est c'est que c'est pas a cet endroit que ca bloque (comme dit plus haut).
Sinon j'ai des index sur site_id, date_fk date_fk et insert_Date.
Avez vous des idées qui me permetterait d'optimiser ceci?
N'hesitez pas, je prends toute proposition!
Merci d'avance!![]()
Partager