performance-database.xml 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20876 -->
  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
  8. eine gemeinsame <acronym>API</acronym> für <acronym>SQL</acronym> Operationen zu bieten.
  9. <classname>Zend_Db_Table</classname> ist ein Table Data Bateway, dazu gedacht übliche
  10. Tabellen-artige Datenbank Operationen zu abstrahieren. Wegen Ihrer abstrakten Natur und der
  11. "Magie" die Sie versteckt haben um Ihre Operationen durchführen zu können, können Sie
  12. manchmal auch zu Geschwindigkeitsnachteilen 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 <acronym>SQL</acronym> 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. <acronym>SQL</acronym> Select Statements, eine perfekte und legitime Anwendung.
  73. </para>
  74. <para>
  75. Lasse <constant>EXPLAIN</constant> auf den Abfragen laufen, und teste eine Vielzahl
  76. von Möglichkeiten bis man die eigenen Indezes auf dem besten und performantesten
  77. Weg trifft -- und dann sollte dieses <acronym>SQL</acronym> als Klasseneigenschaft
  78. oder Konstante fix kodiert werden.
  79. </para>
  80. <para>
  81. Wenn das <acronym>SQL</acronym> variable Argumente benötigt, können Platzhalter im
  82. <acronym>SQL</acronym> verwendet werden und in einer Kombination von
  83. <methodname>vsprintf()</methodname> und <methodname>array_walk()</methodname>
  84. verwendet werden um Werte in das <acronym>SQL</acronym> zu injizieren:
  85. </para>
  86. <programlisting language="php"><![CDATA[
  87. // $adapter ist der DB Adapter. In Zend_Db_Table ist es durch
  88. // Verwendung von $this->getAdapter() zu empfangen.
  89. $sql = vsprintf(
  90. self::SELECT_FOO,
  91. array_walk($values, array($adapter, 'quoteInto'))
  92. );
  93. ]]></programlisting>
  94. </sect3>
  95. </sect2>
  96. </sect1>