it-swarm-eu.dev

Vzhledem k tomu, že db_select je mnohem pomalejší než db_query, proč bych ho chtěl použít?

Na pozadí tohoto tématu viz http://drupal.org/node/1067802 .

Vzhledem k tomu všemu, jaké situace existují, kdy bych mohl chtít použít db_select (), nebo bych se měl spoléhat výhradně na db_query?

69
Chris Cohen

Existuje 5 důvodů, proč používat SelectQuery

  • Vytváříte dynamické dotazy s různým počtem podmínek, spojení, polí atd. Viz field_read_fields () pro příklad.

  • Chcete použít tzv. Extenders . Příkladem rozšíření jsou PagerDefault (nahrazuje pager_query () ) a TableSort (nahrazuje tablesort_sql () ). Umožňují přidat SelectQuery dodatečné funkce. Viz také Jak si vytvoříte tabulky stolů s pagerem s daty z vlastní tabulky? . Příklad: node_page_default () .

  • Chcete povolit jiným modulům měnit vaše dotazy. Pak můžete přidat tzv. tagy a SelectQuery automaticky zavolá odpovídající alternativní háček pro tuto značku. Velmi se na to spoléhám se svým modulem Privatemsg (To jsme již udělali v D6 pomocí vlastního nástroje pro tvorbu dotazů).

  • Pokud chcete/potřebujete použít systém node_access pouze k zobrazení uzlů, které má uživatel k dispozici. Stačí přidat značku 'node_access' do svého dotazu $. Nahrazuje db_rewrite_sql ().

  • SelectQuery má několik funkcí, které pomáhají zajistit, aby váš kód fungoval ve všech podporovaných databázích. Například existuje SelectQuery :: orderRandom () . A pokud máte podmínku LIKE, -> podmínka ('field', $ value, 'LIKE') zajistí, že se vždy jedná o malé a velké písmena. V D6 jste museli použít LOWER () pro to, co bylo mnohem pomalejší. Ale AFAIK, právě teď není víc než tyto dva.

Pokud žádný z těchto důvodů neplatí pro konkrétní případ, použijte db_query ().

88
Berdir

Vždy používám db_select, protože upřednostňuji čitelnost, udržovatelnost a kompatibilitu napříč databázemi před malými nárůsty výkonu. Navíc si myslím, že čísla uvedená ve zmíněném čísle dávají špatný obraz o celkovém výkonu. Mluvíme o 300 mikrosekundových rozdílech v dotazu, který při návratu více než jednoho sloupce často běží v rozmezí několika milisekund. A nebyl bych překvapen, kdyby existoval pouze jednorázový režijní náklad (zatížení třídy), a tím by rozdíly v požadavku na celou stránku byly mnohem menší.

9
fietserwin

dokumentace o db_query() říká:

Tuto funkci použijte pro dotazy SELECT, pokud se jedná pouze o jednoduchý řetězec dotazů. Pokud volající nebo jiné moduly potřebují změnit dotaz, použijte raději db_select ().

9
marcvangend