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

PostgreSQL Discussion :

Quel est le mieux?


Sujet :

PostgreSQL

  1. #1
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut Quel est le mieux?
    bonjour,

    je suis sous postgre 8.3, et j'ai un update à faire j'ai deux solutions mais je ne suis pas sure de laquelle est la plus approprié sur ce sgbdr car j'ai l'habitude de développer sous oracle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update table1
    set nom = X
    where exists (select 1 from table2 where table2.id = table1.id);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table1
    set nom = X
    where table1.id in (select table2.id from table2);
    Sachant que j'ai presque un million de lignes, je sais qu'en oracle 10g exists est préférable mais sur postgre je ne sais pas.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    Mets-nous les plans d'exécution (les résultats de "explain ta_requête")

  3. #3
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    les voici :

    Avec in :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Hash IN Join  (cost=33317.69..3599576.94 rows=984342 width=3547)"
    "  Hash Cond: (nms.irecipientid = cus.irecipientid)"
    "  ->  Seq Scan on nmsrecipient nms  (cost=0.00..149439.90 rows=3864790 width=3547)"
    "  ->  Hash  (cost=17167.42..17167.42 rows=984342 width=4)"
    "        ->  Seq Scan on cusatariuser cus  (cost=0.00..17167.42 rows=984342 width=4)"
    Avec exists :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Seq Scan on nmsrecipient nms  (cost=0.00..32519143.14 rows=1932395 width=3547)"
    "  Filter: (subplan)"
    "  SubPlan"
    "    ->  Index Scan using cusatariuser_recipientid on cusatariuser cus  (cost=0.00..8.38 rows=1 width=0)"
    "          Index Cond: (irecipientid = $0)"

  4. #4
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    Le coût est apparemment plus faible avec le NOT IN
    Quels sont les temps d'exécution des deux requêtes ?

  5. #5
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Merci de me consacrer du temps, en fait c'est pour un développeur qui est venu me demander un avis sur sa requête car avec le 'exists' sont update sur près de 1 Millions de lignes était déjà arrivé à 30 minutes.

    Donc il a arrêté, je vais lui dire de faire avec le 'in' et je vous dis le temps d'exécution par la suite.

    Merci

  6. #6
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    Affirmer que la bonne syntaxe est "NOT IN" ou "EXISTS" ou même une jointure n'est pas toujours vrai, cela dépend notamment du SGBD (certains sont capables de réécrire la requête avant de l'exécuter par exemple)

    Le plus sûr est donc à mon sens de comparer les coûts des plans d'exécutions (moyennant que ceux-ci soient corrects avec des statistiques à jour )

    Les id de table1 et table2 (les colonnes de jointure) sont-elles indexées ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel est le mieux pour sécuriser des données?
    Par olivierdauxais dans le forum Langage
    Réponses: 23
    Dernier message: 08/07/2015, 18h59
  2. Orthophotos et parcellaire, quel est le mieux calé ?
    Par Max_B dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 07/09/2012, 13h31
  3. [Access 2003] Quel est le mieux?
    Par anouar_chaieb dans le forum Sécurité
    Réponses: 1
    Dernier message: 25/02/2009, 19h52
  4. Quel est le mieux pour faire du SOAP ?
    Par gifffftane dans le forum Services Web
    Réponses: 1
    Dernier message: 28/03/2008, 00h26
  5. Grille d'images: quel est le mieux ?
    Par boon31 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 07/11/2007, 13h05

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