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 :

pouvoir effectuer un SELECT sur table pendant gros INSERT ?


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut pouvoir effectuer un SELECT sur table pendant gros INSERT ?
    Bonjour,

    Je souhaite injecter des données dans une table d'une base MySQL 5.0 tout en pouvant effectuer des SELECT sur la table active.

    J'injecte un grand nombre de données et je voudrais pouvoir contrôler l'état d'avancement des INSERT. Actuellement, je n'ai la main sur la table qu'une fois l'INSERT effectué.

    Sauriez-vous comment pouvoir faire ceci ?

    En vous remerciant,

    C. Tobini

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut
    Bonne question.
    Comme je suis pas sur mon poste je pourrais pas trop testé mais tu pourrais tester les LOW_PROPERTY. Cela aura pour effet d'insérer seulement quand la table est libre. Si tu place en plus un HIGHT_PROPERTY sur ton SELECT cela aura peut être de pouvoir lire les données. A savoir quand même que cela aura pour effet de retarder l'opération.
    Il y a un autre parametre à prendre en compte. Il y a plusieurs syntaxe d'insert possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO xxx (...) VALUES (...);
    INSERT INTO xxx (...) VALUES (...);
    INSERT INTO xxx (...) VALUES (...);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO xxx (...) VALUES (...), (...), (...);
    Si tu es dans le deuxième cas je ne pense pas que la méthode au déssus puisse fonctionner.

    Ici je n'ai fais qu'une méthode que j'ai en tête mais je crois qu'il y en a d'autre. Il se pourrait aussi que c'est lié au vérouillage de la table. A vérifier.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci de la réponse,

    J'ai tenté une INSERT DELAYED, pour l'instant la table n'est pas nourrie.

    Je 'croise' 53 000 000 de lignes avec 24 000 000 de lignes d'autres tables et 200 000 lignes d'une autre base, le tout bourré d'index évidemment

    Apparement les transactions ne permettent pas non plus d 'avoir de visibilité sur les requêtes, je vais m'intéresser aux logs pour voir s'il y a moyen de savoir où en est la requête.

    C. Tobini

  4. #4
    Membre éprouvé
    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
    Points : 1 249
    Points
    1 249
    Par défaut
    Par défaut les transactions sont isolées afin que l'on ne voit que les modifications après leur commit. C'est généralement ce que l'on veut mais ça peut se régler.

    Donc avec plusieurs requêtes d'insertion (s'il y a autant de données ça doit déjà être le cas) et des commit de temps à autre, autocommit ou encore en jouant sur le mode isolation ça devrait le faire.

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Pour compléter la réponse de Sivrît, j'ajouterai que les transactions (et donc l'isolation) ne concerne que les tables InnoDB.

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut
    Je me demande si en utilisant un COUNT(*) au lieu de lire le contenu de cette table ne change pas le mécanisme de lecture. C'est à dire qu'il est possible de lire cette information.

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Pour les tables MyISAM, il y a effectivement un mécanisme de lecture spécial pour le COUNT(*) sur l'ensemble de la table.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour à tous et merci de vos réponses,

    J'ai temporairement résolu le problème avec un script Perl :

    J'appelle la commande dans une boucle while() en créant un shift d'un million sur les id de ma table temporaire de départ, chaque fois qu'un million de ligne est traité, j'en suis averti dans mon Terminal.

    Je vais regarder du côté des transactions pour pouvoir traiter tout en global et vérifier de temps en temps l'évolution du traitement.

    Bonne journée à vous,

    C. Tobini

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

Discussions similaires

  1. INSERT / SELECT sur tables multiples
    Par AlexisB dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/11/2008, 15h17
  2. Select sur table de jointure qui pointe sur la meme Table.
    Par yakamax dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/06/2008, 11h44
  3. Réponses: 4
    Dernier message: 11/01/2008, 12h18
  4. [Hibernate][Tomcat] Select sur tables
    Par parasol007 dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 12/05/2006, 14h01
  5. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38

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