Nos complace anunciar el lanzamiento de :
Servicio Couchbase Index Advisor
http://index-advisor.couchbase.com
¿Otro servicio más? ¿Por qué?
Hace unos años lanzamos N1QL (SQL para JSON) para que pudieras utilizar SQL para recuperar y manipular datos JSON. Pero a menos que se creen buenos índices, las consultas no funcionan tan bien. ¿Cómo saber si el índice creado es lo suficientemente bueno para nuestro motor de consultas? Así que decidimos poner todas las reglas que hacen un buen índice. Pero eso implicaba leer demasiado. Así que vamos a ir un paso más allá para darte más poder. Ahora lanzamos un servicio -Asesor de índices-que acepte una consulta y ofrezca una recomendación de índice que cumpla con las expectativas de nuestro motor de consulta-todo sin descargar el último servidor Couchbase.
¿Para quién?
Este servicio proporcionará recomendaciones sobre índices para ayudar a los administradores de bases de datos, desarrolladores y arquitectos a optimizar el rendimiento de las consultas y cumplir los acuerdos de nivel de servicio.
Index Advisor se lanza como parte de Couchbase Server 6.5. Si has descargado esa versión, entonces tienes todo (y más) de lo que proporciona este servicio.
¿Cuándo utilizar este servicio?
Si tú:
- Quiere evitar leer el creación de índices normasCompréndalos y aplíquelos para encontrar los índices adecuados para su consulta/consultas/carga de trabajo.
- Aún no desea descargar la última versión del servidor Couchbase 6.5.
- ¿Está utilizando un versión anterior de Couchbase y necesitas ayuda para crear los índices adecuados para tus consultas.
- Desea generar consejos para los índices sin crear un cubo o cargar el esquema o los datos.
Antecedentes:
N1QL es el SQL para datos y metadatos JSON. Cada consulta escrita en N1QL tiene un plan de consulta preparado por el motor de consulta N1QL. El rendimiento y la eficiencia de una consulta dependen de su plan. La creación de índices correctos para los datos ayuda en la selección de aquellos índices que pueden recuperar el conjunto de resultados de la manera más eficiente. Aunque el documento JSON en sí no tiene esquema, el índice necesita tener un esquema.
Por ejemplo, índice ix1(campo1,campo2) es diferente del índice ix2(campo2,campo1).
Por lo tanto, no sólo son importantes los campos que seleccionamos para un índice, sino también el orden en que están presentes en un índice. (Del índice FTS hablaremos en otro blog).
La vida de una consulta:
Dependiendo de lo bueno que sea el paso 4, podemos minimizar u omitir completamente los pasos 5 y 6 y mejorar así el rendimiento de la consulta. Para ayudar en esta tarea, hemos lanzado Index Advisor.
http://index-advisor.couchbase.com
Index Advisor: ¡el servicio!
Con Index Advisor, puede
- Proporcione una consulta o varias consultas de incluso un servidor anterior a 6.5 y el servicio le recomendará los índices que debe tener/crear para obtener el mejor rendimiento.
- Como no disponemos de sus datos ni de su esquema, no podemos saber si dispone actualmente de esos índices. Pronto mejoraremos esta interfaz para que acepte datos/estadísticas/esquemas/inferencias/índices actuales - o cualquier otra cosa que nos puedas proporcionar para hacer mejores recomendaciones.
Una vez que nos proporcione la consulta con la directiva ADVISE, la herramienta le dará las recomendaciones para el índice mínimo y el índice de cobertura.
- Índices: En esta sección se enumeran los índices recomendados en función de los predicados de la cláusula WHERE/ON, junto con la regla de recomendación correspondiente que sigue cada índice.
- Índices de cobertura: Esta sección enumera los índices de cobertura aplicables a la consulta de entrada, es decir, un índice que incluye todos los campos a los que se hace referencia en la consulta para evitar el salto adicional al servicio de datos.
Este es el aspecto de la herramienta. Haz clic en el gif de abajo para verlo con claridad.
Ejemplos:
1.
1 |
CONSEJO SELECCIONE fname, edad, edad/7 AS edad_perro_años DESDE ensayo DONDE fname = Sara |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": [ { "índices_recomendados": { "índices_de_cobertura": [ { "declaración_índice": "CREATE INDEX adv_fname_age ON `trial`(`fname`,`age`)", "keyspace_alias": "juicio" } ], "índices": [ { "declaración_índice": "CREATE INDEX adv_fname ON `trial`(`fname`)", "keyspace_alias": "juicio", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta". } ] } } ] }, "consulta": "SELECT fname, age, age/7 AS age_dog_years FROM trial WHERE fname = 'Sara'" } ] } |
2.
1 2 |
CONSEJO SELECCIONE (DISTINTO compras.customerId)DESDE compras DONDE compras.compradoEn ENTRE "2014-03-01" Y "2014-03-31" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": [ { "índices_recomendados": { "índices": [ { "declaración_índice": "CREATE INDEX adv_purchasedAt ON `purchases`(`purchasedAt`)", "keyspace_alias": "compras", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 4. no menor que/entre/no mayor que". } ] } } ] }, "consulta": "SELECT (DISTINCT purchases.customerId) FROM purchases\nWHERE purchases.purchasedAt BETWEEN \"2014-03-01\" Y "2014-03-31"" } ] } |
3.
1 2 3 4 |
CONSEJO SELECCIONE DISTINTO aerolínea.nombre,aeropuerto.nombre AS aeropuerto,ruta.distancia DESDE `viaje-muestra` aeropuerto INTERIOR ÚNASE A `viaje-muestra` ruta EN aeropuerto.faa = ruta.fuenteaeropuerto Y ruta.tipo = "ruta" INTERIOR ÚNASE A `viaje-muestra` aerolínea EN ruta.aerolínea = aerolínea.iata Y aerolínea.tipo = "aerolínea" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": [ { "índices_recomendados": { "índices_de_cobertura": [ { "declaración_índice": "CREATE INDEX adv_type_sourceairport_airline_distance ON `travel-sample`(`type`,`sourceairport`,`airline`,`distance`)", "keyspace_alias": "ruta_viaje_de_muestra" }, { "declaración_índice": "CREATE INDEX adv_type_iata_name ON `viaje-muestra`(`type`,`iata`,`name`)", "keyspace_alias": "travel-sample_airline } ], "índices": [ { "declaración_índice": "CREATE INDEX adv_type_sourceairport ON `travel-sample`(`type`,`sourceairport`)", "keyspace_alias": "ruta_viaje_de_muestra", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta, 10. predicado join no estático". }, { "declaración_índice": "CREATE INDEX adv_type_iata ON `viaje-muestra`(`tipo`,`iata`)", "keyspace_alias": "travel-sample_airline, "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta, 10. predicado join no estático". } ] } } ] }, "consulta": "SELECT DISTINCT airline.name,airport.name AS airport,route.distance FROM `viaje-muestra` airport INNER JOIN `viaje-muestra` route ON airport.faa = route.sourceairport AND route.type = \"route\"\nINNER JOIN `travel-sample` airline ON route.airline = airline.iata AND airline.type = \"airline\"\nWHERE airport.type = \"airport\" AND airport.city = \"San Jose\";" } ] } |
4.
1 2 3 |
SELECCIONE ASESOR(["SELECT * FROM `viajes-muestra` WHERE type = 'hotel' AND city = 'Paris'", "SELECT * FROM `muestra-de-viajes` h JOIN `muestra-de-viajes` a ON a.ciudad = h.ciudad WHERE h.type = 'hotel' AND a.type = 'airport'"]) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "resultados": [ { "$1": { "índices_recomendados": [ { "índice": "CREATE INDEX adv_type_city ON `travel-sample`(`type`,`city`)", "declaraciones": [ { "run_count": 1, "declaración": "SELECT * FROM `viajes-muestra` WHERE type = 'hotel' AND city = 'Paris'" }, { "run_count": 1, "declaración": "SELECT * FROM `muestra-viaje` h JOIN `muestra-viaje` a ON a.ciudad = h.ciudad WHERE h.tipo = 'hotel' AND a.tipo = 'aeropuerto'" } ] } ] } } ] } |
Los índices candidatos se generan siguiendo las reglas de diseño especificadas aquí.
Lo que queda por hacer:
1. 1. Mejorar la interfaz de usuario de esta herramienta. Proporcionar recomendaciones de índice en texto para cortar y pegar más fácilmente. Actualmente proporciona una salida JSON.
2. Aceptar sabores para poder generar recomendaciones de índices parciales.
3. Proporcionar una forma de permitir al usuario introducir el esquema, los índices existentes, inferir la salida, tal vez incluso datos de prueba.
Nos encantaría que nos dijera qué le ha parecido la herramienta y qué funciones adicionales le gustaría ver. Comparta su opinión a través de los comentarios.
Más información sobre la función Index Advisor:
https://www.couchbase.com/blog/n1ql-index-advisor-improve-query-performance-and-productivity/
https://www.couchbase.com/blog/index-advisor-for-query-workload/
https://docs.couchbase.com/server/6.5/n1ql/n1ql-language-reference/advise.html
https://docs.couchbase.com/server/6.5/n1ql/n1ql-language-reference/advisor.html
https://docs.couchbase.com/server/6.5/tools/query-workbench.html#index-advisor
Resumen:
El asesor de índices (sentencia ADVISE) proporciona recomendaciones de índices para una única consulta. Aconseja índice regular, índice de matriz e índice de cobertura y proporciona información sobre la regla de recomendación correspondiente que sigue cada clave de índice.
El asesor de índices (sentencia ADVISOR) proporciona recomendaciones de índices para múltiples consultas. Recomienda el menor número posible de índices adecuados para todas las consultas de la matriz.
Pruébelo en casa.
http://index-advisor.couchbase.com