IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Rechercher 100 mille personnes dans une base en contenant près de 19 millions


Sujet :

Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut Rechercher 100 mille personnes dans une base en contenant près de 19 millions
    Bonjour,

    Avant l'arrêt définitif d'une base Oracle 12g, laquelle sera migrée à la fin de l'année sur PostgreSQL, il m'est confié une dernière mission, celle de vérifier que près de 100 000 personnes soient ou non connues dans cette base. Cette base recense environ 19 millions de personnes.

    Le problème est le suivant : je ne dispose que du nom et des prénoms de chaque personne... Pas d'autre information. Cet échantillon était une extraction datant de quelques années suite à une opération particulière.

    La table des personnes, appelée CLIENT, est ainsi composée :
    - la clé primaire
    - le nom
    - les prénoms
    - la date de naissance
    - le lieu de naissance
    - le pays de naissance (non obligatoire)

    Je ne m'imagine pas créer un script avec à chaque ligne une requête du type "SELECT * FROM CLIENT WHERE NOM LIKE '$nom' AND PRENOMS LIKE '$prenom';". Une rapide estimation du temps nécessaire est d'environ 4 semaines... L'objectif est de faire cette vérification d'ici fin juin prochain.

    Y aurait-il une bien meilleure stratégie pour optimiser de telles recherches ? Je peux développer en Java/Hibernate un algo s'il le faut, cela ne me dérange pas.

    Merci à toute personne pouvant m'orienter.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Les nom/prénoms de ces 100000 personnes sont stockés où? Il peut y avoir des différences dans la casse et d'accents?

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Créez une table, même temporaire dans laquelle vous mettez les noms et prénoms à raison d'un nom par colonne nom et des prénoms séparés par une virgule dans la colonnes prénoms.
    Ensuite faites une jointure entre les deux en splittant la colonne prénoms avec la fonction Oracle adéquate ou une requête récursive

    Quelque chose du genre :
    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
    16
    WITH
    split_prenom AS
    (SELECT nom, CASE INSTR(prenoms, ',') = 0 THEN prenoms ELSE SUBSTR(prenoms,  1, INSTR(prenoms, ',') - 1) END AS prenom,
            CASE INSTR(prenoms, ',') = 0 THEN '' ELSE SUBSTR(prenoms,  INSTR(prenoms, ',') + 1, LENGTH(prenoms) - INSTR(prenoms, ',')) END AS prenoms
     FROM recherche
    UNION ALL
    SELECT nom, CASE INSTR(prenoms, ',') = 0 THEN prenoms ELSE SUBSTR(prenoms,  1, INSTR(prenoms, ',') - 1) END AS prenom,
            CASE INSTR(prenoms, ',') = 0 THEN '' ELSE SUBSTR(prenoms,  INSTR(prenoms, ',') + 1, LENGTH(prenoms) - INSTR(prenoms, ',')) END AS prenoms
     FROM split_prenom 
    WHERE prenoms <> ''
    )
     
    SELECT *
    FROM  CLIENTS AS C
              JOIN split_prenom AS R
              ON C.nom = R.nom AND C.prenom = R.prenom
    Non testé

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Même réponse que SQLPro, si tu peux avoir tes 100000 noms sous une forme qui peut être injectée en masse dans une table, créer une table, même temporaire, y injecter les données, et ensuite requête avec jointure.

    A défaut, si jamais tu peux quand même scripter sur ces 100000 noms, tu peux toujours essayer de faire un script qui va te générer les 100000 requêtes pour éviter de les taper à la main.


    Par contre, nom/prénom, c'est clairement pas suffisant pour identifier une personne. Tu vas potentiellement avoir une bonne quantité de doublons juste avec ces infos-là.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Les nom/prénoms de ces 100000 personnes sont stockés où? Il peut y avoir des différences dans la casse et d'accents?
    Bonjour,

    Les noms et prénoms sont stockés dans un fichier texte, ils ont été extraits d'une autre base. C'est bien là tout mon problème !

    La casse est une difficulté supplémentaire, toutes ces chaînes sont converties en majuscules. Enfin, les lettres accentuées sont peu nombreuses, cet aspect peut être négligé.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Créez une table, même temporaire dans laquelle vous mettez les noms et prénoms à raison d'un nom par colonne nom et des prénoms séparés par une virgule dans la colonnes prénoms.
    Ensuite faites une jointure entre les deux en splittant la colonne prénoms avec la fonction Oracle adéquate ou une requête récursive

    Quelque chose du genre :
    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
    16
    WITH
    split_prenom AS
    (SELECT nom, CASE INSTR(prenoms, ',') = 0 THEN prenoms ELSE SUBSTR(prenoms,  1, INSTR(prenoms, ',') - 1) END AS prenom,
            CASE INSTR(prenoms, ',') = 0 THEN '' ELSE SUBSTR(prenoms,  INSTR(prenoms, ',') + 1, LENGTH(prenoms) - INSTR(prenoms, ',')) END AS prenoms
     FROM recherche
    UNION ALL
    SELECT nom, CASE INSTR(prenoms, ',') = 0 THEN prenoms ELSE SUBSTR(prenoms,  1, INSTR(prenoms, ',') - 1) END AS prenom,
            CASE INSTR(prenoms, ',') = 0 THEN '' ELSE SUBSTR(prenoms,  INSTR(prenoms, ',') + 1, LENGTH(prenoms) - INSTR(prenoms, ',')) END AS prenoms
     FROM split_prenom 
    WHERE prenoms <> ''
    )
     
    SELECT *
    FROM  CLIENTS AS C
              JOIN split_prenom AS R
              ON C.nom = R.nom AND C.prenom = R.prenom
    Non testé

    A +
    Bonjour,

    Merci pour cette piste intéressante ! Je tâche de faire cela dès demain. Il va me falloir faire une petite mécanique pour cumuler les prénoms dans une même colonne.

    J'espère vite répondre.

    Merci !

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Même réponse que SQLPro, si tu peux avoir tes 100000 noms sous une forme qui peut être injectée en masse dans une table, créer une table, même temporaire, y injecter les données, et ensuite requête avec jointure.

    A défaut, si jamais tu peux quand même scripter sur ces 100000 noms, tu peux toujours essayer de faire un script qui va te générer les 100000 requêtes pour éviter de les taper à la main.


    Par contre, nom/prénom, c'est clairement pas suffisant pour identifier une personne. Tu vas potentiellement avoir une bonne quantité de doublons juste avec ces infos-là.

    Tout à fait : je m'attends à des doublons... il me faudra les transmettre pour justement les régler.

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Citation Envoyé par DomIII Voir le message
    Bonjour,

    Les noms et prénoms sont stockés dans un fichier texte, ils ont été extraits d'une autre base. C'est bien là tout mon problème !

    La casse est une difficulté supplémentaire, toutes ces chaînes sont converties en majuscules. Enfin, les lettres accentuées sont peu nombreuses, cet aspect peut être négligé.

    Ok dans ce cas tu peux créer une table externe qui pointe sur ton fichier. C'est une table qui te permet de faire un mapping direct entre ton fichier et une table :
    https://oracle.developpez.com/guide/...age=Chap1#L1-5

    Tu peux alors utiliser cette table pour la joindre à la table CLIENT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from table_ext e
    where exists (select 1 from client c
                      where c.nom = e.nom and c.prenom = e.prenom
                     );

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Quels sont les droits dont tu disposes ? Si tu poses cette question, j'ai le sentiment que tu as des autorisations très limitées ?

    Si tu as les droits pour faire uniquement des SELECT, ça va être très long. Demande de l'aide en interne, à quelqu'un qui a plus de droits.
    Si tu as les droits pour créer des tables, c'est mieux.
    Créer une table externe qui pointe sur ton fichier, comme proposé par vanagreg, ça peut être encore plus simple. Mais pour ça, il faut que tu aies les droits pour déposer ton fichier sur le serveur de ta machine oracle.


    Selon les droits que tu as, ta question est soit comment trouver une *%$#!&*ç de solution, soit quelle solution choisir parmi toutes les possibilités.

    Et peut-être que le problème principal que tu vas rencontrer, c'est un truc avec les prénoms multiples, ou avec les accents, ou avec les doublons. Plein de petits pièges possibles dès qu'on veut faire des traitements sur des chaines de caractères pas forcément normalisées.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Quels sont les droits dont tu disposes ? Si tu poses cette question, j'ai le sentiment que tu as des autorisations très limitées ?

    Si tu as les droits pour faire uniquement des SELECT, ça va être très long. Demande de l'aide en interne, à quelqu'un qui a plus de droits.
    Si tu as les droits pour créer des tables, c'est mieux.
    Créer une table externe qui pointe sur ton fichier, comme proposé par vanagreg, ça peut être encore plus simple. Mais pour ça, il faut que tu aies les droits pour déposer ton fichier sur le serveur de ta machine oracle.


    Selon les droits que tu as, ta question est soit comment trouver une *%$#!&*ç de solution, soit quelle solution choisir parmi toutes les possibilités.

    Et peut-être que le problème principal que tu vas rencontrer, c'est un truc avec les prénoms multiples, ou avec les accents, ou avec les doublons. Plein de petits pièges possibles dès qu'on veut faire des traitements sur des chaines de caractères pas forcément normalisées.
    Bonjour,

    Je ne dispose que de droits de lecture et ne peux accéder la base Oracle qu'à distance. Je me suis résolu à développer une petite application Java/Hibernate qui cherche les personnes. Il tourne depuis hier matin, j'ai calculé par analogie ce matin que 6 semaines seront nécessaires... en admettant que rien n'arrive. J'ai demandé RV à la responsable de projet pour obtenir le droit de faire une table temporaire comme cela m'a été conseillé ici.

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Ok dans ce cas tu peux créer une table externe qui pointe sur ton fichier. C'est une table qui te permet de faire un mapping direct entre ton fichier et une table :
    https://oracle.developpez.com/guide/...age=Chap1#L1-5

    Tu peux alors utiliser cette table pour la joindre à la table CLIENT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from table_ext e
    where exists (select 1 from client c
                      where c.nom = e.nom and c.prenom = e.prenom
                     );
    Un immense merci pour cette suggestion. Je fais le forcing pour avoir accès au serveur.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Le problème est en cours de résolution, après quelques jours de travail.

    J'ai fini par créer une nouvelle base MySQL en y important les tables nécessaires de la base initiale. J'ai donc appliqué les conseils ci-dessus, à savoir générer une table contenant pour chaque instance le nom de famille et tous les prénoms (ainsi, plusieurs personnes de même nom sont représentés par une seule et unique instance). A partir de la requête proposée par SQLpro, j'en ai créé une permettant des croisements. Je l'ai programmée en Java/Hibernate 6, cela tourne depuis 7 jours, j'en suis à environ 35% du processus total. Je prévois la fin entre les 22 et 23 avril prochains. Cette décision de prendre Java me permet de tout tracer dans des fichiers différents (merci log4J), en fonction de l'initiale du nom. J'ai donc 26 fichiers distincts, ce qui me facilite l'exploitation.

    A l'heure actuelle, près de 80% des personnes cherchées ont été trouvées.

    Je reviendrai ici dès que ce sera terminé.

    Encore merci pour votre aide.

  13. #13
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Tout ça me paraît bien long.

    Tu as créé une base MySQL. Bien. Donc sur cette base, tu as tous les droits.
    Tu peux créer une table avec tes 19Millions d'enregistrements. Tu peux créer une autre table avec tes 100 000 enregistrements. Admettons que tout ça prenne une journée.
    Ensuite, tu peux faire une requête qui croise ces 2 tables. Et tu devrais avoir ta réponse en 1 heure au grand maximum. Disons quelques heures si tu fais ça sur un PC de base un peu fatigué.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Dans une table de 100 000 personnes, il est très probable qu'avec seulement le nom et le prénom, il y a de nombreux homonymes.

    Ce faisant, quelle que soit la méthode utilisée, les résultats ne seront pas fiables.

    Et effectivement, rapprocher 100 000 de 19 000 000 devrait durer tout au plus 30 minutes sur un ordinateur peu performant...

Discussions similaires

  1. Réponses: 18
    Dernier message: 10/02/2017, 09h09
  2. probleme de recherche d'un utilisateur dans une base
    Par univermina dans le forum ASP
    Réponses: 8
    Dernier message: 16/01/2009, 11h53
  3. Recherche par mot clé dans une base de donnée
    Par sihamsisim dans le forum ASP
    Réponses: 1
    Dernier message: 24/04/2008, 20h59
  4. Recherche d'un champ dans une base
    Par vanou dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2006, 10h31
  5. ASp - recherche d'un champs dans une base.
    Par kmayoyota dans le forum ASP
    Réponses: 5
    Dernier message: 03/12/2004, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo