it-swarm.it

Dato che db_select è molto più lento di db_query, perché dovrei usarlo?

Per lo sfondo su questo, vedere http://drupal.org/node/1067802 .

Alla luce di tutto ciò, quali situazioni esistono dove potrei voler usare db_select () o dovrei fare affidamento esclusivamente su db_query?

69
Chris Cohen

Esistono 5 motivi per utilizzare SelectQuery

  • Stai creando query dinamiche con un numero variabile di condizioni, join, campi e così via. Vedi field_read_fields () per un esempio.

  • Si desidera utilizzare il cosiddetto Extender . Gli extender di esempio sono PagerDefault (sostituisce pager_query () ) e TableSort (sostituisce tablesort_sql () ). Ciò consente di aggiungere ulteriori funzionalità a SelectQuery. Vedi anche Come si creano tabelle ordinabili con un cercapersone con dati da una tabella personalizzata? . Un esempio: node_page_default () .

  • Desideri consentire ad altri moduli di modificare le tue query. Quindi è possibile aggiungere il cosiddetto tag e SelectQuery chiamerà automaticamente un hook alter corrispondente per quel tag. Sto facendo molto affidamento su questo con il mio modulo Privatemsg (lo abbiamo già fatto in D6 con un generatore di query personalizzato).

  • Se si desidera/è necessario utilizzare il sistema node_access per mostrare solo nodi che l'utente può vedere. Aggiungi il tag 'node_access' alla tua $ query. Questo sostituisce db_rewrite_sql ().

  • SelectQuery ha alcune funzionalità che aiutano a far funzionare lo stesso codice su tutti i database supportati. Ad esempio c'è SelectQuery :: orderRandom () . E se hai una condizione LIKE, -> condition ('field', $ value, 'LIKE') farà in modo che sia sempre un confronto senza distinzione tra maiuscole e minuscole. In D6, dovevi usare LOWER () per quello che era molto più lento. Ma AFAIK, non ci sono più di questi due in questo momento.

Se nessuno di questi motivi si applica per un caso specifico, utilizzare db_query ().

88
Berdir

Uso sempre db_select poiché preferisco la leggibilità, la manutenibilità e la compatibilità incrociata tra database rispetto a piccoli miglioramenti delle prestazioni. Inoltre, penso che i numeri forniti nel numero citato diano un'immagine sbagliata della prestazione complessiva. Stiamo parlando di una differenza di 300 microsecondi su una query che, quando restituisce più di una singola colonna, viene spesso eseguita nell'intervallo di più millisecondi. E non sarei sorpreso se ci fosse un sovraccarico solo una volta (caricamento di classe) e quindi che le differenze per una richiesta (pagina) completa siano molto inferiori.

9
fietserwin

La documentazione su db_query() dice:

Utilizzare questa funzione per le query SELECT se è solo una semplice stringa di query. Se il chiamante o altri moduli devono modificare la query, utilizzare invece db_select ().

9
marcvangend