web-dev-qa-db-fra.com

Étant donné que db_select est beaucoup plus lent que db_query, pourquoi voudrais-je l'utiliser?

Pour le contexte à ce sujet, veuillez consulter http://drupal.org/node/1067802 .

Compte tenu de tout cela, quelles situations existe-t-il où je pourrais vouloir utiliser db_select (), ou devrais-je compter uniquement sur db_query?

69
Chris Cohen

Il y a 5 raisons d'utiliser SelectQuery

  • Vous créez des requêtes dynamiques avec un nombre variable de conditions, de jointures, de champs, etc. Voir field_read_fields () pour un exemple.

  • Vous voulez utiliser ce qu'on appelle Extender . Des exemples d'extendeurs sont PagerDefault (remplace pager_query () ) et TableSort (remplace tablesort_sql () ). Ceux-ci permettent d'ajouter des fonctionnalités supplémentaires à SelectQuery. Voir aussi Comment créez-vous des tableaux triables avec un pager avec les données d'une table personnalisée? . Un exemple: node_page_default () .

  • Vous souhaitez autoriser d'autres modules à modifier vos requêtes. Ensuite, vous pouvez ajouter ce que l'on appelle tags et SelectQuery appellera automatiquement un crochet correspondant pour cette balise. Je m'appuie fortement sur cela avec mon module Privatemsg (nous l'avons déjà fait en D6 avec un générateur de requêtes personnalisé).

  • Si vous souhaitez/devez utiliser le système node_access pour afficher uniquement les nœuds que l'utilisateur est autorisé à voir. Ajoutez simplement la balise 'node_access' à votre requête $. Cela remplace db_rewrite_sql ().

  • SelectQuery a quelques fonctionnalités qui aident à faire fonctionner votre code de la même manière dans toutes les bases de données prises en charge. Par exemple, il y a SelectQuery :: orderRandom () . Et si vous avez une condition LIKE, -> condition ('field', $ value, 'LIKE') s'assurera qu'il s'agit toujours d'une comparaison insensible à la casse. En D6, vous deviez utiliser LOWER () pour ce qui était beaucoup plus lent. Mais AFAIK, il n'y a pas plus que ces deux-là en ce moment.

Si aucune de ces raisons ne s'applique à un cas spécifique, utilisez db_query ().

88
Berdir

J'utilise toujours db_select car je préfère la lisibilité, la maintenabilité et la compatibilité croisée des bases de données aux petits gains de performances. De plus, je pense que les chiffres donnés dans le numéro mentionné donnent une mauvaise image de la performance globale. Nous parlons d'une différence de 300 microsecondes sur une requête qui, lors du retour de plusieurs colonnes, s'exécute souvent dans la plage de plusieurs millisecondes. Et je ne serais pas surpris s'il y a des frais généraux uniques (chargement de classe) et donc que les différences pour une demande complète (page) sont beaucoup moins.

9
fietserwin

la documentation sur db_query() dit:

Utilisez cette fonction pour les requêtes SELECT s'il ne s'agit que d'une simple chaîne de requête. Si l'appelant ou d'autres modules doivent modifier la requête, utilisez plutôt db_select ().

9
marcvangend