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

Requêtes MySQL Discussion :

Requête update lente


Sujet :

Requêtes MySQL

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 390
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 390
    Points : 3 002
    Points
    3 002
    Par défaut Requête update lente
    Bonjour

    Je teste une requête de mise à jour sur une table de 18 colonnes tout à fait standards (chaînes et valeurs numériques) et de 400 000 lignes.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update `matable` set `monchamp` = 0 where `monindexprimaire` <> 0;
    Résultat en local : 13 secondes

    Je trouve ça très long mais peut-être est-ce normal ?

    Pouvez-vous me confirmer que c'est normal ou si il y a un problème éventuel ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Il faudrait montrer le schema complet de la table, et un plan d'exécution (utiliser la commande EXPLAIN).

  3. #3
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Le prédicat "différent de" (<>) est dit "non sargable", ça signifie qu'aucun index ne peut être utilisé pour ce type de critères.

    En effet, rechercher une valeur égale, supérieure, inférieure, commençant par... permet de passer par un index, mais pour vérifier qu'une valeur est différente de celle choisie, il faut parcourir toutes les lignes de la table !

    C'est ce qui explique que ce type de restrictions ne sera jamais performant dès que la population de la table est significative.

    Pour information, dans une table d'un SGGBD relationnel, il n'y a pas de champs, mais il y a des colonnes.

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 390
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 390
    Points : 3 002
    Points
    3 002
    Par défaut
    Ah d'accord !
    Sachant que les valeurs ne peuvent pas être négatives, si j'utilise plutôt " > 0 " ça devrait donc être plus efficace ?

    Pour colonne au lieu de champ, c'est vrai, mea culpa.

  5. #5
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Si toutes les valeurs sont supérieures à zéro, ajouter une restriction WHERE ma_PK > 0 ne servira à rien non plus.
    En effet, une restriction n'est pertinente pour ce qui concerne les performances que si son facteur de filtrage (% de lignes récupérées) est bon (de l'ordre de 10% maxi en général).

    Vu qu'ici cette restriction renvoie toutes les lignes, passer par l'index serait contre performant : le moteur lirait l'index pour rechercher l'adresse des data autant de fois qu'il y a de lignes dans l'index. Donc autant parcourir séquentiellement toutes les data, ce sera plus rapide.

    Donc dans ce contexte, là non plus, l'optimiseur ne choisira pas de passer par l'index (sauf cas particulier d'index couvrant, mais là c'est une autre histoire, sans rapport avec le facteur de filtrage )

  6. #6
    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 397
    Points
    9 397
    Par défaut
    Est-ce que la colonne 'monchamp' est indexée elle aussi ?
    Si oui, ça peut expliquer le temps relativement long. En noircissant un peu beaucoup le tableau, à chaque ligne modifiée, le moteur remet à jour l'index. Et plus on avance, plus il galère à remettre à jour l'index.

    Mais de toutes façons, un update est toujours long.
    Un 'Copy' dans une autre table vide, puis un Drop et Rename est souvent plus rapide... mais ça pose des tas d'autres problèmes.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update `matable` set `monchamp` = 0 where `monindexprimaire` <> 0;
    Résultat en local : 13 secondes

    Je trouve ça très long mais peut-être est-ce normal ?

    Pouvez-vous me confirmer que c'est normal ou si il y a un problème éventuel ?
    13 secondes pour modifier 400 k lignes, ça ne me choque pas.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Mais ça pourrait peut-être aller plus vite, d'où l'importance de sortir le plan d'exécution et de reformuler la requête le cas échéant.
    Si le prédicat n'est pas "sargable", cette requête est manifestement non optimisée.

    On peut facilement tester différents scenarii: il suffit faire un select en reprenant les critères de sélection formulés de différentes manières, et on peut ajouter la commande EXPLAIN devant le select, à moins d'avoir un autre outil plus friendly pour afficher le plan d'exécution.

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut Papy214

    Essayes cette requête :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    update `matable` set `monchamp` = case when `monindexprimaire` > 0 then 0 else `monchamp` end;

    Cordialement
    Artemus
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    @Artemus24 : comme je l'ai expliqué plus haut, puisque la PK a systématiquement une valeur > 0 , ajouter une restriction de ce genre n'a aucun intérêt, car non filtrante.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Séb. Voir le message
    13 secondes pour modifier 400 k lignes, ça ne me choque pas.
    Le seul moyen qui permet de rendre une telle requête rapide serait le multithreading. Hélas MySQMerde ne le supporte pas, contrairement à DB2 ou SQL Server ou encore Oracle avec le module Parallel Query payant...

    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/ * * * * *

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. [MariaDB] Requête update très lente
    Par thierryRoussel dans le forum Administration
    Réponses: 7
    Dernier message: 23/02/2018, 03h02
  3. [VB.NET] [ODBC] Pb requête UPDATE avec clé primaire..?
    Par Pleymo dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/03/2005, 18h46
  4. requête update qui marche pas
    Par MrsFrizz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/12/2004, 08h16
  5. PB Requête update
    Par cassi2 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 25/10/2004, 14h15

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