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

SQL Oracle Discussion :

Anonymisation de données - update aléatoire des coordonnées


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 83
    Points : 56
    Points
    56
    Par défaut Anonymisation de données - update aléatoire des coordonnées
    Bonjour à tous,

    Je travaille actuellement sur de l'anonymisation des coordonnées personnes d'une table.

    La Règle de gestion spécifie de "mélanger les nom" de chaque NOM de la table TABLE_NOM.

    Pour ce faire voici la méthode que j'ai utilisée:
    Étape1 : récupération des clés de la table personnes dans la table CLE_PERS_ANONYME
    Étape2 : récupération de manière aléatoire le champ ID_NOM
    Étape3 : mis à jour de la table


    Le code que j'ai utilisé pour l'étape est le suivant :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    DECLARE
          CURSOR c_non
          IS
            SELECT A.* FROM CLE_PERS_ANONYME A
                     WHERE EXISTS (SELECT 1 FROM TABLE_NOM B 
                   WHERE A.NOM=B.NOM);
                         
        BEGIN
          FOR oneEnreg IN c_nom
          LOOP
            UPDATE CLE_PERS_ANONYME CLE_NOM
            SET  NOM =
             
              (SELECT  NOM
              FROM
                (SELECT NOM   FROM TABLE_NOM A  WHERE 
                 and NOM is not null
                ORDER BY DBMS_RANDOM.VALUE
                )
              WHERE rownum = 1
              )
    
    
            WHERE CLE_NOM.id= oneEnreg.id;
            commit;
          END LOOP;
          END;
        /
    Ceci marche bien pour une petite volumétrie de données ...
    Cependant ayant plusieurs millions d'enregistrements à mélanger, c'est vraiment trop trop lent ...
    quel est selon vous la meilleur façon d'optimiser mon code ?

    J'ai essaye de passé par du SAMPLE :

    le code en gras ci-dessous est remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
              (SELECT nom
              FROM
                (SELECT TXT_NOM FROM TABLE_NOM  SAMPLE (1) where nom is not null )
              WHERE ROWNUM = 1
              )
    Sauf que j'obtiens l'erreur suivante :
    PL/SQL: ORA-30560: SAMPLE clause not allowed
    Auriez-vous une idée s'il vous plait ?

    Je vous remercie d'avance pour vos conseils avisés.

  2. #2
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Les update ligne à ligne, c'est pas terrible effectivement.

    Une idée:

    J'ai la table TEST suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create table TEST (id primary key,first_name unique,last_name unique)
    Je crée une table identique en mélangeant les noms:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table SHUFFELED as 
    select
    id
    , nvl(lead(first_name)over(partition by part order by ora_hash(first_name)),first_value(first_name)over(partition by part order by ora_hash(first_name))) first_name
    , nvl(lead(last_name)over(partition by part order by ora_hash(last_name)),first_value(last_name)over(partition by part order by ora_hash(last_name))) last_name
    from (
    select /*+ PARALLEL(TEST 8)*/ id,first_name,last_name,ora_hash(first_name) first_name_hash,ora_hash(last_name) last_name_hash,mod(ora_hash(id),8) part from TEST
    ) order by 1
    /
    Le principe:
    - on calcule un hash function pour chaque colonne (avec ora_hash )
    - on va trier sur cette colonne et prendre la valeur de l'enregistrement suivant (avec lead. Le nvl et le first_value c'est pour faire un décalage circulaire... il y a peut-être mieux)
    - pour profiter du parallélisme, je fais de paquets avec modulo 8

    Cordialement,
    Franck
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

Discussions similaires

  1. [XL-2010] Création d'un graphique avec sélection aléatoire des données
    Par HoneySlice dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/06/2015, 11h20
  2. [AC-2007] Importation d'un fichier CVS vers une table, ordre aléatoire des données
    Par lio33 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/01/2015, 11h48
  3. Nom de l'appli à des coordonnées données
    Par Captain'Flam dans le forum Windows
    Réponses: 3
    Dernier message: 31/05/2011, 15h19
  4. Générer aléatoirement des coordonnées
    Par kamnouz dans le forum Physique
    Réponses: 2
    Dernier message: 01/06/2009, 18h48
  5. update avec des données d'une autre table
    Par corto31 dans le forum Requêtes
    Réponses: 13
    Dernier message: 10/07/2008, 16h40

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