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

PHP & Base de données Discussion :

Opération DELETE OPTIMIZE REPAIR TRUNCATE [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 48
    Points : 29
    Points
    29
    Par défaut Opération DELETE OPTIMIZE REPAIR TRUNCATE
    Bonjour,

    Je post ce message car j'ai un petit soucis avec PDO et les requêtes longues en terme de temps d'éxécution comme DELETE/OPTIMIZE/REPAIR ou TRUNCATE.

    Je suis passé à PDO la semaine dernière et forcément j'ai encore quelques lacunes :p

    Je développe des passerelles clientes qui me permettent de transmettre des annonces d'un site immobilier à un autre.

    Il y a donc un flux important de données, quotidien.

    J'ai des bases de données qu'on pourrait qualifier de transition qui me permettent de faire les premiers traitements avant envoi sur la base principale.

    Je traite donc les informations dans les bases de transition puis les envoi dans la base principale. Une fois ce traitement effectuée je vide les tables de transition qui peuvent contenir plus de 50 000 lignes et je supprime les annonces obsolètes de ma base principale.

    Voici comment je raisonnais pour suppression avant avec mysql_query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
    // Exemple 1 pour supprimer quelques annonce
    $delete_id = mysql_query("DELETE FROM annonce WHERE date_maj!='$date_du_jour'"); // Le nombre de suppression peut être important > 5000 par jour
     
    // Exemple 2 pour supprimer la base complète
    $truncate = mysql_query("TRUNCATE TABLE transition"); // Peut être supérieur à 50 000 par jour.
     
    // Ensuite pour maintenir ma table en vie et ne pas la cracher j'utilisais OPTIMIZE & REPAIR
    $optimize = mysql_query("OPTIMIZE TABLE annonce");
    $optimize = mysql_query("OPTIMIZE TABLE transition");
     
    // Puis Repair
    $repair = mysql_query("REPAIR TABLE annonce");
    $optimize = mysql_query("REPAIR TABLE transition");
    ?>

    1/ Était-ce une bonne façon de faire sous mysql_query ?



    2/ Voici ce que cela me donne maintenant sous PDO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <?php
    $delete_id = $pdo->exec("DELETE FROM annonce WHERE date_maj!='$date_du_jour'"); // Le nombre de suppression peut être important > 5000 par jour
     
    // Exemple 2 pour supprimer la base complète
    $truncate = $pdo->exec("TRUNCATE TABLE transition"); // Peut être supérieur à 50 000 par jour.
     
    // Ensuite pour maintenir ma table en vie et ne pas la cracher j'utilisais OPTIMIZE & REPAIR
    $optimize = $pdo->exec("OPTIMIZE TABLE annonce");
    $optimize = $pdo->exec("OPTIMIZE TABLE transition");
     
    // Puis Repair
    $repair = $pdo->exec("REPAIR TABLE annonce");
    $optimize = $pdo->exec("REPAIR TABLE transition");
    ?>

    Mon problème :
    Avant tout fonctionnait bien.. mais ça c'était avant.. :p.. bon ok

    Ces requêtes se validaient bien avec mysql_query et aucune erreur ne s'affichait et bien plus maintenant..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    Warning: PDO::exec() [pdo.exec]: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in /home/ on line 984
     
    ?>

    A/ Soit il n'y a plus besoin ou il n'y a jamais eu besoin de faire OPTIMIZE / REPAIR ?

    B/ Soit les requêtes sont lentes et du coup l'action n'est pas fini quand PHP ordonne la seconde action et du coup tout plante ?

    Je souhaite préserver au mieux ma base..

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Apparement les requête TRUNCATE vérouillent un jeu de résultat.
    Il est donc nécessaire de libérer la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $truncate = $pdo->exec("TRUNCATE TABLE transition");
    $pdo->closeCursor();
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 48
    Points : 29
    Points
    29
    Par défaut
    Oui pour closeCursor j'avais vu la fonction mais elle ne va pas interrompre truncate/optimize/delete/repair en cours de route ?

    PDOStatement::closeCursor() libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées, mais quitte la requête

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    PHP ne fait rien tant que le exec au dessus n'est pas terminé.
    Concernant closeCursor la traduction est mauvaise "laisse la requête dans une état lui permettant d'être à nouveau exécutée"
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 48
    Points : 29
    Points
    29
    Par défaut
    Super merci :)

    Pour ceux qui passerait par la on peut aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    $truncate = $pdo->prepare("TRUNCATE TABLE transition");
    $truncate->execute();
    $truncate->closeCursor();
    ?>

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

Discussions similaires

  1. Trace d'une opération delete record
    Par azouzmenai24 dans le forum Oracle
    Réponses: 4
    Dernier message: 15/02/2015, 09h19
  2. Accélérer une opération DELETE complexe.
    Par Sergejack dans le forum Contribuez
    Réponses: 5
    Dernier message: 08/05/2010, 17h52
  3. opération 'delete this'
    Par coyotte507 dans le forum C++
    Réponses: 12
    Dernier message: 01/07/2007, 15h39
  4. Réponses: 2
    Dernier message: 06/12/2004, 14h43
  5. [Tuning] truncate ou delete
    Par phig dans le forum Administration
    Réponses: 10
    Dernier message: 17/06/2004, 16h41

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