performance-database.xml 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15099 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="performance.database">
  5. <title>Zend_Db Performance</title>
  6. <para>
  7. <classname>Zend_Db</classname> ist ein Datenbank Abstraktion Layer und ist dazu gedacht eine
  8. gemeinsame API für SQL Operationen zu bieten. <classname>Zend_Db_Table</classname> ist ein Table
  9. Data Bateway, dazu gedacht übliche Tabellen-artige Datenbank Operationen zu abstrahieren.
  10. Wegen Ihrer abstrakten Natur und der "Magie" die Sie versteckt haben um Ihre Operationen
  11. durchführen zu können, können Sie manchmal auch zu Geschwindigkeitsnachteilen führen.
  12. </para>
  13. <sect2 id="performance.database.tableMetadata">
  14. <title>
  15. Wie kann ich den Overhead reduzieren der von Zend_Db_Table eingeführt wird um die
  16. Metadaten der Tabelle zu erhalten?
  17. </title>
  18. <para>
  19. Um die Verwendung so einfach wie möglich zu halten, und auch sich konstant ändernde
  20. Schemata wärend der Entwicklung zu unterstützen, macht <classname>Zend_Db_Table</classname>
  21. einiges an Magie unter seinem Hut: bei der ersten Verwendung, holt es das
  22. Tabellenschema und speichert es im Objekt. Diese Operation ist normalerweise sehr
  23. teuer, unabhängig von der Datenbank -- das zu einer Schwachstelle in der Produktion
  24. führen kann.
  25. </para>
  26. <para>
  27. Glücklicherweise gibt es Techniken um die Situation zu verbessern.
  28. </para>
  29. <sect3 id="performance.database.tableMetadata.cache">
  30. <title>Den Metadaten Cache verwenden</title>
  31. <para>
  32. <classname>Zend_Db_Table</classname> kann optional <classname>Zend_Cache</classname> verwenden um die
  33. Metadaten der Tabelle zu cachen. Dieser ist typischerweise schneller im Zugriff
  34. und nicht so teuer wie das holen der Metadaten von der Tabelle selbst.
  35. </para>
  36. <para>
  37. Die Dokumentation von <link linkend="zend.db.table.metadata.caching">
  38. <classname>Zend_Db_Table</classname> enthält Informationen über das Cachen der Metadaten
  39. </link>.
  40. </para>
  41. </sect3>
  42. <sect3 id="performance.database.tableMetadata.hardcoding">
  43. <title>Die Metadaten in der Tabellendefinition fix codieren</title>
  44. <para>
  45. Mit 1.7.0, bietet <classname>Zend_Db_Table</classname> auch
  46. <link linkend="zend.db.table.metadata.caching.hardcoding">Unterstützung für fix
  47. kodierte Metadaten in der Tabellen Definition</link>. Das ist ein schwierigerer
  48. Verwendungsfall, und sollte nur dann verwendet werden wenn man weiß das sich das
  49. Tabellenschema nicht ändern wird, oder das man fähig ist die Definition immer
  50. up-to-date zu halten.
  51. </para>
  52. </sect3>
  53. </sect2>
  54. <sect2 id="performance.database.select">
  55. <title>
  56. SQL die mit Zend_Db_Select erzeugt wurde greift nicht auf die Indezes zu; wie kann man
  57. das besser machen?
  58. </title>
  59. <para>
  60. <classname>Zend_Db_Select</classname> ist relativ gut in seinem Job. Trotzdem kann es, wenn man
  61. komplexe Abfragen benötigt die Joins oder Unterabfragen enthalten, sehr naiv sein.
  62. </para>
  63. <sect3 id="performance.database.select.writeyourown">
  64. <title>Selbst getuntes SQL schreiben</title>
  65. <para>
  66. Die einzige echte Antwort ist es eigenes SQL zu schreiben; <classname>Zend_Db</classname>
  67. erfordert nicht die Verwendung von <classname>Zend_Db_Select</classname>, als ist die
  68. Verwendung von eigenen, getunten SQL Select Statements, eine perfekte und legitime
  69. Anwendung.
  70. </para>
  71. <para>
  72. Lasse <code>EXPLAIN</code> auf den Abfragen laufen, und teste eine Vielzahl von
  73. Möglichkeiten bis man die eigenen Indezes auf dem besten und performantesten Weg
  74. trifft -- und dann sollte dieses SQL als Klasseneigenschaft oder Konstante fix
  75. kodiert werden.
  76. </para>
  77. <para>
  78. Wenn das SQL variable Argumente benötigt, können Platzhalter im SQL verwendet
  79. werden und in einer Kombination von <code>vsprintf</code> und
  80. <code>array_walk</code> verwendet werden um Werte in das SQL zu injizieren:
  81. </para>
  82. <programlisting role="php"><![CDATA[
  83. // $adapter ist der DB Adapter. In Zend_Db_Table ist es durch
  84. // Verwendung von $this->getAdapter() zu empfangen.
  85. $sql = vsprintf(
  86. self::SELECT_FOO,
  87. array_walk($values, array($adapter, 'quoteInto'))
  88. );
  89. ]]></programlisting>
  90. </sect3>
  91. </sect2>
  92. </sect1>
  93. <!--
  94. vim:se ts=4 sw=4 et:
  95. -->