performance-database.xml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="performance.database">
  5. <title>Performance de Zend_Db</title>
  6. <para>
  7. <classname>Zend_Db</classname> est une couche d'abstraction pour les bases de données,
  8. et a pour but de fournir une <acronym>API</acronym> commune pour les opérations
  9. <acronym>SQL</acronym>. <classname>Zend_Db_Table</classname> est un Table Data Gateway,
  10. dont le but est d'abstraire les opérations communes de niveau table. A cause de cette
  11. nature abstraite et de la manière suivant laquelle sont réalisées ces opérations, ces
  12. composants peuvent introduire des pertes de performances.
  13. </para>
  14. <sect2 id="performance.database.tableMetadata">
  15. <title>
  16. Comment réduire la surcharge introduite par Zend_Db_Table lors de la récupération
  17. des métadonnées de table&#160;?
  18. </title>
  19. <para>
  20. Dans le but de maintenir une utilisation la plus simple possible, et aussi de
  21. supporter un changement de schéma permanent au cours du développement,
  22. <classname>Zend_Db_Table</classname> réalise une série d'action en arrière-plan&#160;
  23. à la première utilisation, il analyse le schéma de la table et le stocke dans les
  24. propriétés de l'objet. Cette opération est typiquement coûteuse, indépendamment de la
  25. base de données -- ce qui peut contribuer à des goulots en production.
  26. </para>
  27. <para>
  28. Toutefois, ils existent des techniques permettant d'améliorer ceci.
  29. </para>
  30. <sect3 id="performance.database.tableMetadata.cache">
  31. <title>Utiliser le cache des métadonnées</title>
  32. <para>
  33. <classname>Zend_Db_Table</classname> peut optionnellement utiliser
  34. <classname>Zend_Cache</classname> pour mettre en cahce les métadonnées de la
  35. table. C'est typiquement plus rapide d'accès et moins coûteux que d'accéder à
  36. ces métadonnées directement dans la base de données.
  37. </para>
  38. <para>
  39. La documentation de <link
  40. linkend="zend.db.table.metadata.caching"><classname>Zend_Db_Table</classname></link>
  41. inclue des informations concernant la mise en cache des métadonnées.
  42. </para>
  43. </sect3>
  44. <sect3 id="performance.database.tableMetadata.hardcoding">
  45. <title>Mettre en dur les métadonnées dans votre définition de table</title>
  46. <para>
  47. A partir de la version 1.7.0, <classname>Zend_Db_Table</classname> fournit aussi
  48. <link linkend="zend.db.table.metadata.caching.hardcoding">le support permettant
  49. de stocker les métadonnées en dur dans la définition de la table</link>. Ceci
  50. est un cas d'utilisation très avancé, et ne devrait être utilisé que lorsque
  51. vous êtes que votre schéma de base de données évolue rarement, ou que vous êtes
  52. certain de pouvoir maintenir à jour ces définitions.
  53. </para>
  54. </sect3>
  55. </sect2>
  56. <sect2 id="performance.database.select">
  57. <title>
  58. Le SQL généré avec Zend_Db_Select n'utilise pas mes index&#160;; comment améliorer
  59. ceci&#160;?
  60. </title>
  61. <para>
  62. <classname>Zend_Db_Select</classname> est plutôt bon dans son trvail. Cependant si
  63. vous avez des requêtes complexes requiérant des jointures ou des sous-sélections,
  64. il est souvent assez naïf.
  65. </para>
  66. <sect3 id="performance.database.select.writeyourown">
  67. <title>Ecrire votre SQL amélioré</title>
  68. <para>
  69. La seule véritable réponse est d'écrire vous même votre propre
  70. <acronym>SQL</acronym>&#160;; <classname>Zend_Db</classname> n'oblige pas
  71. l'utilisation de <classname>Zend_Db_Select</classname>, donc fournir votre
  72. propre instruction <acronym>SQL</acronym> de sélection est une approche
  73. parfaitement légitime.
  74. </para>
  75. <para>
  76. Effectuez un <constant>EXPLAIN</constant> sur vos requêtes, et testez plusieurs
  77. approches jusqu'à obtenir un indice le plus performant, ensuite écrivez en dur
  78. votre <acronym>SQL</acronym> en tant que propriété de la classe ou comme
  79. constante.
  80. </para>
  81. <para>
  82. Si votre <acronym>SQL</acronym> requiert des arguments variables, fournissez des
  83. emplacements réservés dans votre <acronym>SQL</acronym>, et utilisez une
  84. combinaison de <methodname>vsprintf()</methodname> et
  85. <methodname>array_map()</methodname> pour injecter les valeurs dans votre
  86. <acronym>SQL</acronym>&#160;:
  87. </para>
  88. <programlisting language="php"><![CDATA[
  89. // $adapter est l'adaptateur de base de données. Dans Zend_Db_Table,
  90. // vous le récupérez en appelant $this->getAdapter().
  91. $sql = vsprintf(
  92. self::SELECT_FOO,
  93. array_map(array($adapter, 'quoteInto'), $values)
  94. );
  95. ]]></programlisting>
  96. </sect3>
  97. </sect2>
  98. </sect1>