performance-database.xml 4.9 KB

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