it-swarm-es.com

Dado que db_select es mucho más lento que db_query, ¿por qué querría usarlo?

Para conocer los antecedentes de esto, consulte http://drupal.org/node/1067802 .

Dado todo eso, ¿qué situaciones existen en las que me gustaría usar db_select (), o debería depender únicamente de db_query?

69
Chris Cohen

Hay 5 razones para usar SelectQuery

  • Está creando consultas dinámicas con un número variable de condiciones, uniones, campos, etc. Ver field_read_fields () para un ejemplo.

  • Desea utilizar los llamados Extenders . Los extensores de ejemplo son PagerDefault (reemplaza pager_query () ) y TableSort (reemplaza tablesort_sql () ). Estos permiten agregar funcionalidades adicionales a SelectQuery. Vea también ¿Cómo hacer tablas ordenables con un buscapersonas con datos de una tabla personalizada? . Un ejemplo: node_page_default () .

  • Desea permitir que otros módulos alteren sus consultas. Luego puede agregar los llamados etiquetas y SelectQuery llamará automáticamente al enlace alternativo correspondiente para esa etiqueta. Confío mucho en esto con mi módulo Privatemsg (ya lo hicimos en D6 con un generador de consultas personalizado).

  • Si desea/necesita utilizar el sistema node_access para mostrar solo los nodos que el usuario puede ver. Simplemente agregue la etiqueta 'node_access' a su consulta $. Esto reemplaza db_rewrite_sql ().

  • SelectQuery tiene algunas características que ayudan a que su código funcione igual en todas las bases de datos compatibles. Por ejemplo, hay SelectQuery :: orderRandom () . Y si tiene una condición LIKE, -> condition ('field', $ value, 'LIKE') se asegurará de que siempre sea una comparación entre mayúsculas y minúsculas. En D6, tenía que usar LOWER () para lo que era mucho más lento. Pero AFAIK, no hay más que estos dos en este momento.

Si ninguno de estos motivos se aplica a un caso específico, use db_query ().

88
Berdir

Siempre uso db_select ya que prefiero legibilidad, mantenibilidad y compatibilidad cruzada de bases de datos en lugar de pequeñas ganancias de rendimiento. Además, creo que los números dados en el número mencionado dan una imagen incorrecta del rendimiento general. Estamos hablando de una diferencia de 300 microsegundos en una consulta que, al devolver más de una columna, a menudo se ejecuta en el rango de varios milisegundos. Y no me sorprendería si hay algunos gastos generales por única vez (carga de clase) y, por lo tanto, que las diferencias para una solicitud completa (página) son mucho menores.

9
fietserwin

El documentación sobre db_query() dice:

Use esta función para consultas SELECT si es solo una cadena de consulta simple. Si la persona que llama u otros módulos necesitan cambiar la consulta, use db_select () en su lugar.

9
marcvangend