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 :

compter nombre de lignes pendant une insertion


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut compter nombre de lignes pendant une insertion
    Bonjour,

    j'insère dans une table le résultat d'une requete avec qqchose comme :

    insert into xxx select ....

    Par contre le select peut renvoyer pas mal de lignes et donc cela peut être assez long. J'aimerai donc afficher le nombre de lignes déjà insérées avant que cette requête ne soit terminée (dans un autre thread)

    Le pb c'est que mysql me locke la table tant que ce n'est pas terminé et donc je n'arrive pas à avoir le nombre de lignes insérées avant que l'insertion complète soit terminée !!

    Quelqu'un a une solution ? J'ai cherché dans la doc mysql mais je ne trouve pas . J'espère que c'est possible ???

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut
    J'ai l'impression que je n'ai pas été assez clair ... je recommence :

    J'ai une requête INSERT INTO xxxx select yyyyyyy qui prend pas mal de temps du fait du nombre de lignes à insérer.

    J'aimerai donc sur une autre instance faire un select count(*) from xxxxx à intervalles réguliers pour afficher le nombre de lignes insérées et cela tant que l'insert n'est pas terminé.

    Le problème c'est que j'ai l'impression que le select "attend" que l'insert soit terminé et du coup cela ne me sert plus à rien ??

    Est ce que quelqu'un peut me confirmer qu'il s'agit d'un problème de verrouillage ? et si oui comment procéder ???

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    Billets dans le blog
    14
    Par défaut
    Effectivement, ça ne me semble pas possible directement en SQL.
    Une technique pourrait être de lancer la requête d'insertion en plusieurs fois en ajoutant à la fin du SELECT un LIMIT et donc d'insérer par tranche de 10000 par exemple.
    Mais ça rallonge l'insertion globale et je ne pense pas que ce soit le but.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut
    Merci CinePhil de t'interesser à mon problème

    pour contourner le pb j'ai essayé

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    avant de lancer pour mon select count et dans ce cas, la requête est exécutée sans attente par contre cela me renvoit toujours 0 tant que la requête d'insertion n'est pas terminée ! arghhh

    L'autre idée était de passer par des insert delayed mais à priori cela ne fonctionne pas avec insert into ... select ....

    je sais plus ou chercher ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut
    J'ai pas tout compris mais cela a fonctionné une fois ??? Par contre je n'arrive pas à le reproduire :

    J'ai fait qqchose comme ca : je suis plus trop sûr ???

    SET AUTOCOMMIT = 0

    SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    Puis derrière mes select count(*) tant que la requête d'insersion n'est pas finie. Et là j'ai bien eu le nombre de lignes en cours d'insersion.

    Par contre impossible de reproduire, désormais j'ai que des 0 tant que l'insersion complète n'est pas terminée.

    Je cherche, je cherche ...

  6. #6
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Effectivement, ça ne me semble pas possible directement en SQL.
    Une technique pourrait être de lancer la requête d'insertion en plusieurs fois en ajoutant à la fin du SELECT un LIMIT et donc d'insérer par tranche de 10000 par exemple.
    Mais ça rallonge l'insertion globale et je ne pense pas que ce soit le but.
    Personnellement, plutôt que de jouer sur des particularités (voire des défauts) de la BDD, il me semble préférable de revoir un peu l'approche.

    D'abord un SELECT sur les PK à insérer, afin de mesurer ce qu'il y a à faire, et ensuite découper ça en N tranches. Ensuite, il ne reste qu'à faire N INSERT/SELECT en ajoutant à chaque fois une clause BETWEEN au WHERE.

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    Billets dans le blog
    14
    Par défaut
    Ce n'est pas un défaut de la BDD.
    Tu lances une requête au SGBD et il l'exécute du mieux qu'il peut.

    Au fait, quelle est la volumétrie à traiter ?

    Cette lenteur pourrait aussi être due à un mauvais indexage des tables ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Par défaut
    Merci Sivrît

    cela me semble effectivement la meilleure solution
    Je fais ça

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

Discussions similaires

  1. Compter le nombre de lignes d'une source d'un formulaire?
    Par grenoult dans le forum VBA Access
    Réponses: 9
    Dernier message: 16/02/2018, 16h45
  2. Réponses: 7
    Dernier message: 14/03/2014, 13h39
  3. Compter le nombre de lignes d'une requête sélection
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/07/2006, 12h11
  4. Réponses: 4
    Dernier message: 05/05/2006, 23h52
  5. Réponses: 6
    Dernier message: 21/04/2006, 11h22

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