Prepárese....
Uno de los aspectos más impresionantes del uso de N1QL es la posibilidad de utilizar sentencias preparadas. ¿Qué son las sentencias preparadas? ¿Por qué usarlas? ¿Para qué sirven? Considere el siguiente ejemplo de la muestra de viajes y el conjunto de datos que se incluyen con cada instalación de couchbase: Pensemos en usuarios que crean cuentas, inician sesión y buscan vuelos. Podríamos querer una forma rápida de identificar a los usuarios que han utilizado el sistema, pero que nunca han reservado un vuelo. Se trata de un caso de uso común para la segmentación publicitaria y crea una oportunidad para un punto de contacto. Una consulta simplificada podría tener este aspecto:
SELECT nombre FROM viaje-muestra WHERE _type='Usuario' AND ARRAY_LENGTH(vuelos)=0;
Vamos a repasar los pasos necesarios para ejecutar esta consulta desde nuestra aplicación. Utilizaremos nodejs para nuestro ejemplo, y todos los SDK que utilicen la API 2.0 funcionarán de forma idéntica.
- En primer lugar, tenemos que crear la consulta N1QL a partir de una cadena.
- En segundo lugar, serializamos la solicitud y la enviamos a CBQ-ENGINE en el nodo servidor couchbase utilizando HTTP REST.
- En tercer lugar, CBQ-ENGINE debe analizar la consulta.
- En cuarto lugar, el Optimizador de CBQ-ENGINE debe determinar un plan de ejecución.
- En quinto lugar, CBQ-ENGINE debe crear el plan de ejecución.
- En sexto lugar, CBQ-ENGINE ejecuta el plan.
![]()
Se trata de una cantidad de trabajo considerable para emitir una simple consulta, especialmente en el caso de consultas que se repiten varias veces. Hay casos en tu aplicación en los que la misma consulta puede ejecutarse miles de veces en una hora. ¿Cómo podemos eliminar la sobrecarga de analizar y crear un plan?
¡Prepárate para acelerar!
Podemos eliminar la sobrecarga preparando la sentencia para su ejecución. Utilizamos un parámetro adicional en nuestra consulta N1QL, adhoc=false.
¿Qué significa eso exactamente? Significa que el SDK pasará una consulta a CBQ-ENGINE, diciéndole al motor la primera vez que se emita la consulta que "quiero que generes un plan de ejecución, que pueda reutilizar, y me lo devuelvas en un formato comprimido". Después de esa primera vez, cada vez que la aplicación llame a esa consulta en particular, el SDK pasará el plan comprimido a CBQ-ENGINE, eliminando todos los pasos de análisis y creación y pasando directamente a la ejecución.
![]()
Estar preparado
¿Cómo funciona? Cuando se pasa una consulta y el indicador adhoc se establece en false, el SDK almacenará el plan de consulta local comprimido en la caché para reutilizarlo en el futuro; cuando se vuelva a realizar la consulta, el SDK utilizará el plan local comprimido de la caché. El SDK utiliza una caché LRU (least recently used) para conservar memoria: el SDK comenzará a eliminar las entradas más antiguas cuando la caché alcance un tamaño de 5000 consultas.
Todo esto se gestiona internamente dentro del SDK. Como usuario, lo único que tienes que hacer es establecer la propiedad adhoc en false.
Una onza de prevención
Algunas buenas prácticas a tener en cuenta al utilizar declaraciones preparadas
- Actualmente, las sentencias preparadas son específicas de cada instancia del SDK. La caché LRU local de sentencias preparadas es específica para cada instancia del SDK que la aplicación está utilizando. Actualmente no existe una caché compartida de sentencias entre clientes.
- Si su aplicación es de naturaleza extremadamente ad hoc, las sentencias preparadas son una mala elección para este tipo de consultas. La sobrecarga de la preparación anula cualquier ganancia de rendimiento obtenida al poder utilizar repetidamente el mismo plan de ejecución.
- Las sentencias preparadas son planes de ejecución congelados en el tiempo. Los cambios de topología que muevan, alteren o eliminen índices invalidarán el plan de ejecución actual. Los SDKs han incorporado una lógica de reintento para manejar estos casos.
- Si tiene intención de realizar la misma consulta repetidamente con diferentes parámetros, utilice consultas parametrizadas en lugar de incrustar los valores de los parámetros en la cadena de consulta. Esto le permite utilizar el mismo plan con diferentes parámetros.
Para obtener más ejemplos sobre cómo utilizar Couchbase en el idioma de su elección, consulte la página Guía del desarrolladory github repositorio. Descargar Couchbase ¡hoy mismo y prepárese!
