Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2011, 12h28   #1
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 33
Points : 26
Points : 26
Par défaut Stratégie de stockage pour gérer les traductions

Bonjour,

Nous cherchons actuellement la meilleure stratégie (au niveau performance) à adopter pour gérer le stockage des traductions d'une application en Java. Prendre en compte les points suivants :
- Il faudrait éviter le maximum de jointures. Une table pourrait contenir toutes les traductions mais il faudrait rajouter de nombreuses jointures coûteuses aux requêtes applicatives.
- On doit pouvoir trier ou faire des recherches sur une traduction. Exemple : tris de la liste des clients sur le type de clients. Le type de client est une chaine internationalisable.
- Nous avons essayé les colonnes XMLTYPE pour gérer les trads mais elles sont couteuses en performance.

Avez-vous d'autres solutions ?

Cordialement
Michenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 14h17   #2
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Citation:
Envoyé par Michenux Voir le message
- Il faudrait éviter le maximum de jointures.
Pourquoi ? Le principe du reationnel c'est d'uiliser des jointures pour éviter d'être redondant et donc être performant ...
Citation:
Envoyé par Michenux Voir le message
Une table pourrait contenir toutes les traductions mais il faudrait rajouter de nombreuses jointures coûteuses aux requêtes applicatives.
Coûteuses en quoi ?

Est-il possible d'avoir une description plus détaillée du problème ?
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/04/2011, 14h35   #3
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 33
Points : 26
Points : 26
Sur les applications à haute volumétrie, les jointures deviennent très coûteuses en CPU et temps de réponse. Certaines optimisations consistent à ajouter des colonnes de cache sur certaines tables pour éviter ces jointures. Aussi, plus la requête est complexe et plus Oracle aura du mal à trouver un plan d'exécution optimale. Nous cherchons actuellement à déterminer la meilleure solution à mettre en oeuvre pour gérer une internationalisation.

Il y a plusieurs solutions possibles, on peut prendre un exemple sur une table
T_TYPECLIENT avec une colonne label que tu veux internationaliser.

*Solution 1:
- Tu transformes ta colonne label en une colonne qui va contenir la clé de traduction.
- Tu ajoutes une table de traduction (clé de trad, langue, value) avec en valeur par exemple: "champs1.label", "fr_FR", "Nom");
- Dans tes requêtes, tu fais une jointure sur la clé de trad

*Solution 2:
- Tu prévois par exemple 5 colonnes dans ta table TYPECLIENT : langue_fr, langue_en, langue_ar, etc...
- Tu évites la jointure mais ton appli aura un nombre de langues limitées.

*Solution 3:
- On avait pensé à une colonne TRAD de type XMLTYPE sur la table TYPECLIENT qui contient un doc genre <i18n><lng key="fr">Nom</lng><lng key="en">Name</lng></i18n>
- Tu évites la jointure, tu gères autant de langues que tu veux mais on s'est rendu compte que les colonnes xml étaient consommatrices en CPU.
Michenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 14h49   #4
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Je reste convaincu que la solution 1 reste la plus efficiente avec un partitionnement par clé de traduction (en range) avec une pk (clé de traduction + langue).

Il est possible de varier la solution 3 en utilisant des nested tables.

Pas d'autre idée comme ça à chaud
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h17   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par Michenux Voir le message
Sur les applications à haute volumétrie, les jointures deviennent très coûteuses en CPU et temps de réponse. Certaines optimisations consistent à ajouter des colonnes de cache sur certaines tables pour éviter ces jointures. Aussi, plus la requête est complexe et plus Oracle aura du mal à trouver un plan d'exécution optimale.
...
N'importe quoi! Prouvez-le !
Les bases des données existent pour faire des jointures.
Par contre il est vrai que les applications mal écrite peuvent mettre à genou n’importe quelle version d’Oracle ou autre SGBD.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/04/2011, 16h29   #6
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 33
Points : 26
Points : 26
J'ai pas écrit ce post pour critiquer les jointures mais pour trouver la meilleure solution pour gérer les trads par rapport à vos connaissances/expériences.
Si pour vous, cé de le faire avec une table de traductions + jointures, alors vous m'avez répondu
Michenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 18h24   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je vais dans le même sens que les précédentes réponses : faites un modèle relationnel propre en suivant une méthodologie type Merise.

Si votre base est volumineuse, une bonne combinaison des partitions et index permettront à vos requêtes de répondre extrêmement vite.
Si votre table à la structure à trois colonnes, faites même une IOT partitionnée.

Je reviens là-dessus :
Citation:
Certaines optimisations consistent à ajouter des colonnes de cache sur certaines tables pour éviter ces jointures.
Ces optimisations n'en sont pas.
Les développeurs qui "optimisent" ainsi ne s'y connaissent que très peu en SQL, et sont persuadés qu'il s'agit d'une super optimisation, alors qu'au final ce n'est qu'un écran de fumée : on fait faire par un serveur applicatif ce qu'un SGBD fait le mieux : en effet vos jointures seront forcément quelque part dans votre code applicatif, avec des jolies boucles qui s'imbriquent.
Et il reste le problème du refresh du cache.
Et si votre cache dépasse la taille de la RAM du serveur applicatif ça ne va rien optimiser du tout.
Et sûrement bien d'autres problèmes dont les développeurs d'optimisations ne vous parleront qu'après la mise en production.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h21   #8
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 33
Points : 26
Points : 26
Quand je parlais colonne de cache, ce n'est pas au niveau applicatif mais toujours au niveau de la BD. C'est par exemple pour accéder à une colonne col1 sur une table D à partir d'une table A et que je dois passer par les tables B et C pour y accéder (via jointures).
Et bien pour éviter çà, on peut faire un modèle un peu moins relationel en dupliquant la donnée col1 dans la table A. Comme çà, pas de jointure à faire mais par contre, on pénalise les mises à jour (2 cols à mettre à jour).

Sinon, j'aime bien l'idée des tables IOT. A tester.
Michenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h12   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par Michenux Voir le message
...
Sinon, j'aime bien l'idée des tables IOT. A tester.
Pourquoi ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h20   #10
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 33
Points : 26
Points : 26
Moins d'IO
Michenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h47.


 
 
 
 
Partenaires

Hébergement Web