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

Optimisations SGBD Discussion :

Optimisation d'un INSERT sans doublon


Sujet :

Optimisations SGBD

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut Optimisation d'un INSERT sans doublon
    Bonjour,

    J'ai besoin de votre avis sur l'exécution d'un traitement SQL sur une base PostgreSQL 9.1 (cependant mon problème n'est pas vraiment en relation avec Postgres, il est plus général). Avant d'ajouter une donnée en base il faut vérifier si elle n'existe pas déjà. Jusque là rien de méchant mais ça se complique un peu... La table peut contenir plusieurs centaines de milliers d'enregistrements voir quelques millions.

    La clause WHERE du SELECT qui vérifie l'existence d'une donnée en base porte sur 10 ou 11 colonnes sur deux tables.

    Actuellement ce qui a été développé c'est:
    - Si le SELECT ne ramène aucun résultat :
    - le traitement effectue un INSERT pour mettre à jour la base de données
    - Sinon
    - Ajout d'une erreur au bilan de traitement du batch

    La requête est très simple, elle intervient sur deux table via une jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM maTable T1
    JOIN maTable2 T2 ON ...
    WHERE T1.attr1 = 'XXX' and T1.attr2 = 'YYY' and T1.attr3 = 'ZZZ' and ... and T2.attr11 = 'TOTO'
    - maTable peut contenir des centaines de milliers d'enregistrement, voir quelques millions
    - maTable2 elle ne contient qu'une vingtaine d'enregistrement

    Seulement j'ai des doutes sur l'efficacité de ce type de traitement... Il parait une mauvaise idée de mettre un indexe sur 10 champ ? Ne peut-on pas faire autrement ?

    Merci d'avance,
    Romain.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Essaie un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO maTable T1 (/* les colonnes à alimenter */)
    SELECT T2.attr1, T2.attr2 -- etc. => les valeurs à insérer
    FROM /* table source des données à insérer */ T2
    WHERE NOT EXISTS(
    	SELECT *
    	FROM maTable T3
    	WHERE T3.attr1 = T2.attr1 
    		AND T3.attr2 = T2.attr2
    		-- etc
    )

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 247
    Points : 12 883
    Points
    12 883
    Par défaut
    Bonjour,
    Je ne sais pas si c'est du standard SQL, mais avec la clause "IGNORE DUPLICATES", ce n'est pas plus rapide ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO maTable T1 (/* les colonnes à alimenter */)
    SELECT T2.attr1, T2.attr2 -- etc. => les valeurs à insérer
    FROM /* table source des données à insérer */ T2
    IGNORE DUPLICATES

    Tatayo

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut
    Bonjour,

    Je vous remercie pour ces propositions. Je vais voir comment je peux adapter ça à mon code.

    Je pense qu'il faut que je couple ça avec des indexes multi-colonnes ? Mais sur combien de colonnes ? Toutes ? Quelques unes ?

    Romain.

Discussions similaires

  1. insertion image avec macro sans doublon lors de la réexécution
    Par picogunsy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/07/2010, 15h24
  2. Liste chainée triée sans insertion de doublon
    Par Bogs dans le forum Débuter
    Réponses: 1
    Dernier message: 22/03/2009, 18h50
  3. Insertion sans doublons
    Par franculo_caoulene dans le forum Développement
    Réponses: 2
    Dernier message: 16/09/2008, 09h59
  4. [Conception] Insertion de données sans doublon
    Par Yukhaa dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/10/2006, 08h35
  5. [Postgresql] insertion sans doublon
    Par Pwill dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/06/2005, 11h37

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