| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- <?xml version="1.0" encoding="utf-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="performance.database">
- <title>Performance de Zend_Db</title>
- <para>
- <classname>Zend_Db</classname> est une couche d'abstraction pour les bases de données,
- et a pour but de fournir une <acronym>API</acronym> commune pour les opérations
- <acronym>SQL</acronym>. <classname>Zend_Db_Table</classname> est un Table Data Gateway,
- dont le but est d'abstraire les opérations communes de niveau table. A cause de cette
- nature abstraite et de la manière suivant laquelle sont réalisées ces opérations, ces
- composants peuvent introduire des pertes de performances.
- </para>
- <sect2 id="performance.database.tableMetadata">
- <title>
- Comment réduire la surcharge introduite par Zend_Db_Table lors de la récupération
- des métadonnées de table ?
- </title>
- <para>
- Dans le but de maintenir une utilisation la plus simple possible, et aussi de
- supporter un changement de schéma permanent au cours du développement,
- <classname>Zend_Db_Table</classname> réalise une série d'action en arrière-plan 
- à la première utilisation, il analyse le schéma de la table et le stocke dans les
- propriétés de l'objet. Cette opération est typiquement coûteuse, indépendamment de la
- base de données -- ce qui peut contribuer à des goulots en production.
- </para>
- <para>
- Toutefois, ils existent des techniques permettant d'améliorer ceci.
- </para>
- <sect3 id="performance.database.tableMetadata.cache">
- <title>Utiliser le cache des métadonnées</title>
- <para>
- <classname>Zend_Db_Table</classname> peut optionnellement utiliser
- <classname>Zend_Cache</classname> pour mettre en cahce les métadonnées de la
- table. C'est typiquement plus rapide d'accès et moins coûteux que d'accéder à
- ces métadonnées directement dans la base de données.
- </para>
- <para>
- La documentation de <link
- linkend="zend.db.table.metadata.caching"><classname>Zend_Db_Table</classname></link>
- inclue des informations concernant la mise en cache des métadonnées.
- </para>
- </sect3>
- <sect3 id="performance.database.tableMetadata.hardcoding">
- <title>Mettre en dur les métadonnées dans votre définition de table</title>
- <para>
- A partir de la version 1.7.0, <classname>Zend_Db_Table</classname> fournit aussi
- <link linkend="zend.db.table.metadata.caching.hardcoding">le support permettant
- de stocker les métadonnées en dur dans la définition de la table</link>. Ceci
- est un cas d'utilisation très avancé, et ne devrait être utilisé que lorsque
- vous êtes que votre schéma de base de données évolue rarement, ou que vous êtes
- certain de pouvoir maintenir à jour ces définitions.
- </para>
- </sect3>
- </sect2>
- <sect2 id="performance.database.select">
- <title>
- Le SQL généré avec Zend_Db_Select n'utilise pas mes index ; comment améliorer
- ceci ?
- </title>
- <para>
- <classname>Zend_Db_Select</classname> est plutôt bon dans son trvail. Cependant si
- vous avez des requêtes complexes requiérant des jointures ou des sous-sélections,
- il est souvent assez naïf.
- </para>
- <sect3 id="performance.database.select.writeyourown">
- <title>Ecrire votre SQL amélioré</title>
- <para>
- La seule véritable réponse est d'écrire vous même votre propre
- <acronym>SQL</acronym> ; <classname>Zend_Db</classname> n'oblige pas
- l'utilisation de <classname>Zend_Db_Select</classname>, donc fournir votre
- propre instruction <acronym>SQL</acronym> de sélection est une approche
- parfaitement légitime.
- </para>
- <para>
- Effectuez un <constant>EXPLAIN</constant> sur vos requêtes, et testez plusieurs
- approches jusqu'à obtenir un indice le plus performant, ensuite écrivez en dur
- votre <acronym>SQL</acronym> en tant que propriété de la classe ou comme
- constante.
- </para>
- <para>
- Si votre <acronym>SQL</acronym> requiert des arguments variables, fournissez des
- emplacements réservés dans votre <acronym>SQL</acronym>, et utilisez une
- combinaison de <methodname>vsprintf()</methodname> et
- <methodname>array_map()</methodname> pour injecter les valeurs dans votre
- <acronym>SQL</acronym> :
- </para>
- <programlisting language="php"><![CDATA[
- // $adapter est l'adaptateur de base de données. Dans Zend_Db_Table,
- // vous le récupérez en appelant $this->getAdapter().
- $sql = vsprintf(
- self::SELECT_FOO,
- array_map(array($adapter, 'quoteInto'), $values)
- );
- ]]></programlisting>
- </sect3>
- </sect2>
- </sect1>
|