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

ORM PHP Discussion :

Optimisation requete DQL [Doctrine]


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut Optimisation requete DQL
    Voila, j'ai besoin de récuperer une collection d'enregistrement d'une table à partir d'un enregistrement d'une table parente. Ma collection devant être filtrés par une date max.
    Voici mon schéma:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    groupasset:
      actAs: 
        Timestampable:
        Sluggable:
          fields: [name, site]
          unique: true
          canUpdate: true
      columns:
        name: string(255)
        site_id: integer
        user_id: integer
        status: string(2)
        person: string(2)
        lastview: date
      indexes:
        Unique1:
          fields: [name, site_id]
          type: unique
      relations:
        owner:
          class: sfGuardUser
          local: user_id
          foreign: id
          foreignAlias: groupassets
          onDelete: SET NULL
        site:
          class: Site
          local: site_id
          foreign: id
          onDelete: SET NULL
     
    Typeasset:
      tableName: typeasset
      columns:
        name: string(255)
     
    Asset:
      tableName: asset
      actAs: [Timestampable]
      columns:
        typeasset_id: integer
        value: string(255)
        groupasset_id: integer
        etat: string(50)
        action: string(50)
        lastview: date
      indexes:
        unique1:
          fields: [typeasset_id,value,groupasset_id]
          type: unique
        lastview:
          fields: 
            lastview:
              sorting: DESC      
      relations:
        type:
          class: Typeasset
          local: typeasset_id
          foreign: id
          foreignAlias: listTypeAsset
          onDelete: CASCADE
        group:
          class: groupasset
          local: groupasset_id
          foreign: id
          foreignAlias: listGroupAsset
    donc a partir d'un enregistrement dans groupasset je veux récupérer tout les enregistrements liés de la table asset qui ont la date lastview la plus haute.

    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
    17
     
    public function getListActiveGroupAsset()
    	{
    		if ($this->getListGroupAsset()->count()==0) return null;
    		$list = $this->getListGroupAsset();
     
    		$lastView = "2010-11-01";
     
    		foreach($this->getListGroupAsset() as $asset)
    		{
    			if( $asset->getLastview()==$lastView){
    				$list[]=$asset;
    			}
    		}
     
    		return $list;
    	}
    si je met la date en dur comme ci-dessus j'ai un temps d'affichage de 1498ms, tout a fait correcte.
    Mais si je vais chercher cette date:
    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
    17
     
    public function getListActiveGroupAsset()
    	{
    		if ($this->getListGroupAsset()->count()==0) return null;
    		$list = $this->getListGroupAsset();
     
    		$lastView=Doctrine_Core::getTable('Asset')->getLastDate();
     
    		foreach($this->getListGroupAsset() as $asset)
    		{
    			if( $asset->getLastview()==$lastView){
    				$list[]=$asset;
    			}
    		}
     
    		return $list;
    	}
    avec la function getLastDate():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getLastDate(){
    		$q = $this->createQuery('a')
    			->select('DISTINCT a.lastview ')
    			->orderBy('a.lastview DESC')
    			->fetchOne();
    		$lastView = $q->getLastview();
    		return $lastView;
    	}
    je passe à un temps d'affichage de 44262 ms !!!!
    je ne m'explique pas ce temps ahurissant et comment résoudre ça ?

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne suis pas entièrement sur de savoir ce que tu veux comme résultat.

    Par contre, avec la méthode qui recherche la date, tu vas avoir une requête pour chaque membre de getListGroupAsset, ce qui peut faire un nombre important de requête.

    Je pense que tu aurais intérêt à créer une requête unique au départ qui récupère l'ensemble des informations en une seul passe au niveau sql.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    en faites dans ma table asset je peut avoir des enregistrement qui ne sont plus actuel mais que je conserve pour des raisons d'historiques.
    Par contre quand j'affiche les assets d'un group je ne veut affiché que ceux qui sont "actifs";
    pour cela je gére un champ lastview dans la table asset.

    Normalement je ne vais pas chercher la date a chaque enregistrement puisque je vais la chercher avant le Foreach. d'ailleurs au niveau du log des request SQL créés je ne la voie qu'une fois.

    pour la requête unique j'y pense, mais je trouvait intéressant d'utiliser le foreignAlias de ma table asset pour récupérer tout les enregistrements liés à mon groupe et filtrer ensuite sur la date.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Est-ce que, dans ton shema, tu as un index sur lastview ?

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    oui:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    indexes:
        unique1:
          fields: [typeasset_id,value,groupasset_id]
          type: unique
        lastview:
          fields: 
            lastview:
              sorting: DESC

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    En mode debug tu as pu identifier quel partie du code était aussi lente ?

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

Discussions similaires

  1. Optimisation requete
    Par mic79 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/04/2005, 16h35
  2. optimisation requetes (besoin de votre avis)
    Par seb92 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/12/2004, 11h27
  3. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  4. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 17h01
  5. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45

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