Trier un jeu de résultat en cache

Présentez quelques fonctionnalités découvertes au gré de vos développements.

Trier un jeu de résultat en cache

Messagede LordRhumSifflar le Mer 21 Jan 2009 20:44

Bonjour,

Dans un troquet après la réunion CF de novembre (ou décembre:)
Je crois me souvenir avoir aborder, (avec eric si mes souvenirs sont bons) un débat sur l'utilité de la mise en cache de query of query pour trier un jeu de résultat.

Je voulais juste vous donner un exemple qui illustre ces propos :

  1.  
  2. <!--- PARAMETRES--->
  3. <cfapplication sessionmanagement="true" name="LordRhumSifflar_Application">
  4. <cfset listChamps="A,B,C">
  5. <!--- NOM DE LA REQUETE DOIT ETRE UNIQUE ENTRE SESSION--->
  6. <cfset qCached = "nomDeMaRequete#SESSION.cfid#">
  7.  
  8. <cftry>
  9.     <!--- TENTE LA RECUPERATION DE LA REQUETE EN CACHE--->
  10.     <cfquery cachedwithin="#CreateTimeSpan(0, 0, 0, 13)#" name="#qCached#" dbtype="query" >
  11.         SELECT * FROM q
  12.     </cfquery>
  13. <cfcatch >
  14.         <!--- SI LA REQUETE N EXISTAIT PAS (timeout) (premier chargement)--->
  15.         <!--- CREATION D UNE REQUETE--->
  16.     <cfset q = queryNew("#listChamps#","Integer,Integer,Integer")>
  17.     <cfloop from="1" to="10" index="index">
  18.         <cfset QueryAddRow(q,1)>
  19.         <cfloop list="#listChamps#" index="champs">
  20.             <cfset querySetCell(q,"#champs#",RandRange(index-5,index),index)>
  21.         </cfloop>
  22.     </cfloop>
  23.     <!--- MISE EN CACHE DU JEU DE RESULTAT (13 sec)--->
  24.     <cfquery cachedwithin="#CreateTimeSpan(0, 0, 0, 13)#" name="#qCached#" dbtype="query" >
  25.         SELECT * FROM q
  26.     </cfquery>
  27. </cfcatch>
  28. </cftry><!---<cfdump var="#Evaluate(qCached)#" label="jeu de résultat à sauvegarder.">
  29.  
  30. --->
  31.  
  32. <cfquery name="qRequeteTrier" dbtype="query" >
  33.     SELECT * FROM   #qCached#
  34. <cfif IsDefined("url.ChampsATrier") >
  35.     ORDER BY #url.ChampsATrier#
  36. </cfif>
  37. </cfquery>
  38.  
  39. <!--- SORTIE HTML --->
  40. <cfoutput>
  41.     <table border="1" cellpadding="10">
  42.     <cfloop query="qRequeteTrier">
  43.         <cfif qRequeteTrier.currentRow EQ 1>
  44.         <tr><th colspan="#ListLen(listChamps)#">RESULTAT :</th></tr>
  45.         <tr><td colspan="#ListLen(listChamps)#"><cfif IsDefined("url.ChampsATrier")>Trié par : #url.ChampsATrier#</cfif><br /></td></tr>
  46.         <tr>
  47.             <cfloop list="#listChamps#" index="champs">
  48.             <th><a href='?ChampsATrier=#champs#'>#champs#</a></th>
  49.             </cfloop>
  50.         </tr>
  51.         </cfif>
  52.         <tr>
  53.             <cfloop list="#listChamps#" index="champs">
  54.             <td>#Evaluate("qRequeteTrier.#champs#")#</td>
  55.             </cfloop>
  56.         </tr>
  57.     </cfloop>
  58.     </table>
  59. </cfoutput>
  60.  


A bientôtô
LordRhumSifflar
 
Messages: 10
Inscription: Lun 27 Oct 2008 17:06

Re: Trier un jeu de résultat en cache

Messagede eric00000007 le Jeu 22 Jan 2009 23:07

Super. L'astuce est dans le nom de la requête relative à chaque session. Je me méfie des variables de sessions. C'est bien sur à utiliser en fonction de la mémoire du serveur et du nombre de sessions crées.

Cela semble être utile pour des tries de tableaux, mais 13 secondes semble peut pour un utilisateur. Pour quelle utilisation ou quel scénario utilises tu ce cache ?
eric00000007
 
Messages: 489
Inscription: Mer 31 Oct 2007 10:55
Localisation: Paris

Re: Trier un jeu de résultat en cache

Messagede srappaille le Sam 24 Jan 2009 12:05

Bonjour,

Très sympa le troquet. Et en plus, il y avait des bières belges ! :D

En ne touchant à rien d'autre, quelle différence cela donne en terme de performance si on place le résultat final en variable de session comme ceci sans utiliser "cachedwithin" ?

  1. <cfset session.maRequeteEnCache = maRequete>


Bien à tous,

Serge
Avatar de l'utilisateur
srappaille
Site Admin
 
Messages: 378
Inscription: Lun 13 Aoû 2007 14:07
Localisation: Brussels

Re: Trier un jeu de résultat en cache

Messagede LordRhumSifflar le Lun 26 Jan 2009 15:27

"Pour quelle utilisation ou quel scénario utilises tu ce cache"
J'utilise essentiellement cette technique pour préparer des tableaux en vue d'une impression (format pdf).
Cela permet par exemple de mettre en valeur différentes situations pour un même jeu de résultat sans pour autant ré-accéder à une base de données.
(Par exemple : Consolidation par date de commande puis par date de facturation)

pourquoi 13 sec? J'aime bien ce chiffre:). Non sans blague, d'une manière générale, je pense que le principe de mise en cache (ici avec cachedWhitin) est sensiblement toujours le même : il faut avant tout l'utiliser si nous connaissons le délai de rafraichissement des données. Au niveau interface un tri s'effectue souvent assez rapidement ,mais cela dépend bien sur du tableau, des habitudes de l'utilisateur etc...
Pour info 2 manières de forcer le rechargement de la requête :
- mettre le cachedwithin="#CreateTimeSpan(0, 0, 0, 0)#"
- <cfobjectcache action="clear" > (s'applique à tous les objets en cache.)


"quelle différence cela donne en terme de performance si on place le résultat final en variable de session comme ceci sans utiliser "cachedwithin" ?"
En terme de performance, je ne sais pas. Néanmoins cela permet d'avoir un timeout différent de celle des sessions. (en gros la requête en cache peut être libérer avant la fin d'une session).
LordRhumSifflar
 
Messages: 10
Inscription: Lun 27 Oct 2008 17:06

Re: Trier un jeu de résultat en cache

Messagede eric00000007 le Mar 27 Jan 2009 00:48

La méthode de cache par session me semble séduisante mais il faudrait la tester dans un environnement en production.

Il faut surtout faire attention aux objets en cache et à la mémoire max pour cela, via le monitoring et les paramètre d'administration. Si il y a beaucoup de sessions concurrentes pendant ces 13 secondes et que le seuil de cache de requêtes est dépassé, ce cache n'aura plus d'intérêt.

Pour ma part, juste pour échanger mes pratiques (qui ne sont pas toutes bonnes)
  • j'utilise le cahce de Query pour des requêtes sans paramètres redondantes pour différentes sessions.
  • Je n'utilise pas de cache de query pour des requête avec des paramètres.
  • Pour des requêtes gourmandes en temps j'optimise le SQL.
  • Pour réutiliser des résultats de requêtes avec différentes vues, comme par exemple obtenir le résultat d'une requête en HTML, .DOC, .XLS, ... j'utilise toujours le même chemin, choix des paramètres -> la requête -> la vue.
    Je ne suis pas encore a l'aise avec le MVC mais c'est dans la même logique d'organisation du code.
eric00000007
 
Messages: 489
Inscription: Mer 31 Oct 2007 10:55
Localisation: Paris


Retourner vers Documentation, trucs et astuces, études de cas

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron