Bonjour,

Mon problème est le suivant :

Mon application est un genre d'ETL qui va lire de la donnée en entrée CSV/XML/WebServices.
Les données sont lues et insérées en BDD.
Les volumes traités sont de l'ordre de 100Millions de rows (pour un 20aine de tables confondues) par fichier. Plusieurs 10aines de fichiers peuvent être traités séquentiellements (le pas transactionnel est un fichier).
Ces données sont valorisées par rapport à ce qui existe déjà en base.
Des WebService peuvent à tout moment interroger de la donnée en base

Ainsi on se retrouve avec 2 critères importants:
1) Les selects doivent être suffisamment performants pour interroger les données (process ETL + WebServices)
2) Les insertions doivent être suffisemment performantes pour pouvoir traiter une volumétrie de 100Millions de rows en un temps raisonnable (<1h?)


Actuellement le point 1) est traité avec l'utilisation d'indexes. => Les résultats en select sont satisfaisants

Le point 2) est traité avec des insertions en masse, le tout dans la même table où s'effectue les selects. Ce qui amène :
- a cause des indexes (qui doivent rester actifs) de mauvaises performances en insertion
- une dégradation dans le temps très importante (ie: plus on a de données, plus le temps moyen d'une insertion est important)


Pistes envisagées sur le point 2) :
- Constat : des evenements d'attentes "Configuration" Oracle sont remontés et sont considérables : a priori les redo-logs sont mis à rude épreuve.
=> passage de tous les objets du modèle en NOLOGGING, désactivation des FK, dans le but de faire uniquement du directpath.
=> a priori : les redo-logs sont tout de même utilisés et il y a toujours une dégradation des performances

- Utiliser le partition exchange avec des tables de chargement. Seulement je ne suis pas certain de trouver un critère de partitionnement fonctionnel sur chacune de mes tables posant problème. Puis-je faire un partitionnement technique?

- Avoir un schéma en mode lecture (dédié aux select des WebService et du process ETL) et un schéma en mode écriture, puis gérer des synchronisation (totales? incrémentielles?).


J'avoue que mes compétences Oracle sont limitées sur le sujet et j'aimerais avoir votre avis sur les pistes envisagées ou même comment vous aborderiez ce type de problématique.

Merci d'avance