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

Respuestas:

88

Hay 5 razones para usar SelectQuery

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

  • Desea utilizar los llamados Extensores . Los extensores de ejemplo son PagerDefault (reemplaza pager_query () ) y TableSort (reemplaza tablesort_sql () ). Estos permiten agregar funcionalidades adicionales a SelectQuery. Consulte 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 las llamadas 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 usar 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 ninguna de estas razones se aplica a un caso específico, use db_query ().

Berdir
fuente
1
Se agregó un quinto punto, características de portabilidad de la base de datos como orderRandom () y LIKE sin distinción entre mayúsculas y minúsculas.
Berdir
66
Como sexta razón, agregaría compatibilidad cruzada de bases de datos. Las consultas de Oracle, por ejemplo, tienen una sintaxis que difiere en algunos aspectos de MySQL, Postgres, etc. Es mucho más fácil escribir código para generar la sintaxis correcta desde un db_select () que cuando un código de consulta no es muy compatible con Oracle. se vuelca directamente en db_query ().
BrianV
9

La documentación sobredb_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.

marcvangend
fuente
Gracias, pero eso es bastante inespecífico. Deja la definición de 'cadena de consulta simple' bastante abierta a la interpretación. Si selecciono 4 tablas con 6 combinaciones, ¿sigue siendo una consulta simple o debería hacerse con db_select () en su lugar?
Chris Cohen
3
No se trata de una "consulta simple" sino de una " cadena de consulta simple " y simple en realidad significa codificado y no dinámico. Ver mi respuesta para más detalles :)
Berdir
9

Siempre uso db_select ya que prefiero la legibilidad, la mantenibilidad y la 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.

fietserwin
fuente
La diferencia de rendimiento no es tan simple; consulte Comparar el rendimiento de db_query y db_select . Generalmente recomiendo db_query sobre db_select a menos que necesite una de las características especiales mencionadas en la respuesta de Berdir.
geerlingguy