it-swarm.com.de

Warum sollte ich db_select verwenden, da es viel langsamer als db_query ist?

Hintergrundinformationen hierzu finden Sie unter http://drupal.org/node/1067802 .

Welche Situationen gibt es vor diesem Hintergrund, in denen ich möglicherweise db_select () verwenden möchte, oder sollte ich mich ausschließlich auf db_query verlassen?

69
Chris Cohen

Es gibt 5 Gründe, SelectQuery zu verwenden

  • Sie erstellen dynamische Abfragen mit einer unterschiedlichen Anzahl von Bedingungen, Verknüpfungen, Feldern usw. Ein Beispiel finden Sie unter field_read_fields () .

  • Sie möchten so genannte Extender verwenden. Beispiel-Extender sind PagerDefault (ersetzt pager_query () ) und TableSort (ersetzt tablesort_sql () ). Diese ermöglichen es, SelectQuery um zusätzliche Funktionen zu erweitern. Siehe auch Wie erstellen Sie mit einem Pager sortierbare Tabellen mit Daten aus einer benutzerdefinierten Tabelle? . Ein Beispiel: node_page_default () .

  • Sie möchten anderen Modulen erlauben, Ihre Abfragen zu ändern. Dann können Sie so genannte Tags hinzufügen, und SelectQuery ruft automatisch einen entsprechenden Alter-Hook für dieses Tag auf. Ich verlasse mich mit meinem Privatemsg-Modul stark darauf (das haben wir bereits in D6 mit einem benutzerdefinierten Abfrage-Builder gemacht).

  • Wenn Sie das node_access-System verwenden möchten/müssen, um nur Knoten anzuzeigen, die der Benutzer sehen darf. Fügen Sie einfach das Tag 'node_access' zu Ihrer $ -Anfrage hinzu. Dies ersetzt db_rewrite_sql ().

  • SelectQuery verfügt über einige Funktionen, mit denen Ihr Code in allen unterstützten Datenbanken gleich funktioniert. Zum Beispiel gibt es SelectQuery :: orderRandom () . Und wenn Sie eine LIKE-Bedingung haben, stellt -> Bedingung ('Feld', $ Wert, 'LIKE') sicher, dass der Vergleich immer ohne Berücksichtigung der Groß- und Kleinschreibung erfolgt. In D6 mussten Sie LOWER () für das verwenden, was viel langsamer war. Aber AFAIK, im Moment gibt es nicht mehr als diese beiden.

Wenn keiner dieser Gründe für einen bestimmten Fall gilt, verwenden Sie db_query ().

88
Berdir

Ich verwende immer db_select, da ich Lesbarkeit, Wartbarkeit und datenbankübergreifende Kompatibilität kleinen Leistungssteigerungen vorziehe. Darüber hinaus denke ich, dass die in der genannten Ausgabe angegebenen Zahlen ein falsches Bild der Gesamtleistung vermitteln. Wir sprechen von einem Unterschied von 300 Mikrosekunden bei einer Abfrage, die bei der Rückgabe von mehr als einer einzelnen Spalte häufig im Bereich von mehreren Millisekunden ausgeführt wird. Und ich wäre nicht überrascht, wenn es nur einen einmaligen Overhead (Laden von Klassen) gibt und somit die Unterschiede für eine vollständige (Seiten-) Anfrage weitaus geringer sind.

9
fietserwin

Das Dokumentation zu db_query() sagt:

Verwenden Sie diese Funktion für SELECT-Abfragen, wenn es sich nur um eine einfache Abfragezeichenfolge handelt. Wenn der Aufrufer oder andere Module die Abfrage ändern müssen, verwenden Sie stattdessen db_select ().

9
marcvangend