Bonjour,
J'aimerais votre avis sur la meilleure façon de faire pour insérer massivement des données dans plusieurs tables.
Quelques mots sur le context : il s'agit d'un logiciel d'analyse de données issues du séquençage génétique.
Voici le schéma des tables qui nous intéresse.
La table variant contient les mutations génétiques (ref & alt) localisées (chr & pos) dans le génome
La table sample contient les "patients"
La table sample_variant fait le liens entre les patients et les mutations analysées.
La taille de la table variant, et donc de la table sample_variant aussi, vont grossir très vite. Pour chaque patient analysé, on ajoutera environ 50 000 enregistrements. Mais plus on ajoutera des variants, plus on en rencontrera qui existe déjà, et donc plusieurs sample référenceront le même variant. Un calcul "grosse-maille" serait de dire qu'il y a environs 3 milliards de position possible dans le génom, et 4 mutation possibles (si on simplifie), ça ferait une table qui pourrait atteindre les 12 milliards d'enregistrements... ça commence à faire.
Bref ! Les présentations sont faites, maintenant les questions
J'ai un nouveau patient a ajouter en base. Je vais créer une nouvelle entrée dans la table sample => nouveau sample_id
Je vais ensuite vouloir intégrer dans la base les 50 000 variants du patient. Mais pour chacun d'eux, je dois vérifier si il n'existe pas déjà en base. et pour ça je suis obligé de faire par exemple une requête du genre
Pour pouvoir ensuite faire un create variant si il n'existe pas, et créer l'association dans la table sample_variant
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT id FROM variant WHERE chr='chr1' AND pos=781334 AND ref='A' AND alt='C'
- Y a-t-il une façon élégante (mais surtout efficace) de faire un "get_or_create" en postgresql ?
- J'ai lu sur la doc postgres qu'en utilisant les transactions, postgres gérait ensuite tout seul la paralélisation. Combien d'enregistrements par transaction me conseillez vous de mettre ? 500, 1000, 10 000, tout d'un coup ?
- Côté optimisation de la table, à part placer un index sur les 4 champs (chr, pos, ref, alt), je ne vois pas quoi faire d'autre. Vous avez d'autres idées ?
Merci pour votre aide.
Partager