Esta es nuestra entrega de marzo para Servicio Index Advisor para N1QL después de solucionar algunos de los errores que se encontraron tras nuestra última actualización en febrero. Tenemos previsto seguir improvisando el servicio Index Advisor(¿De qué se trata?). Las correcciones en Index Advisor que normalmente vería en la próxima versión de mantenimiento ahora estarán disponibles para usted cada mes.
¿Para quién es? y ¿Cuándo utilizarlo?
http://index-advisor.couchbase.com/
A costa de repetirme,
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.
Este servicio le resultará útil si
- 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 (versión 5.5,6.0) 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.
¿Qué hay de nuevo?
Incluso si usted tiene el servidor Couchbase Server 6.5 descargado y puede utilizar Index Advisor desde Query Workbench, este Index Advisor es una versión más reciente (sin un gran aspecto de interfaz de usuario), pero con los siguientes defectos corregidos.
1.Index Advisor para soportar TTL (meta().expiration & meta.cas)
Con esta mejora, una consulta como
1 2 3 4 5 |
CONSEJO SELECCIONE META().id, META().caducidad DESDE `viaje-muestra` DONDE META().caducidad = 0 PEDIR POR META().id LÍMITE 2; |
que solía dar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span estilo="color: #ff0000">{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": "No hay recomendación de índice en este momento: no se ha encontrado keyspace". } }, "consulta": "SELECT name, META().id\nFROM `travel-sample`\nWHERE META().id > \"g\"\nLIMIT 2;" } ] }</span> |
ahora da
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 |
<span estilo="color: #339966">{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices_de_cobertura": [ { "declaración_índice": "CREATE INDEX adv_meta_self_expiration ON `viaje-muestra`(meta(self).`expiration`)", "keyspace_alias": "viaje-muestra" } ], "índices": [ { "declaración_índice": "CREATE INDEX adv_meta_self_expiration ON `viaje-muestra`(meta(self).`expiration`)", "keyspace_alias": "viaje-muestra", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta". } ] } } }, "consulta": "SELECT META().id, META().expiration\nFROM `travel-sample`\nWHERE META().expiration = 0\nORDER BY META().id\nLIMIT 2;" } </span> <span estilo="color: #339966">] }</span> |
o
1 2 3 4 5 |
CONSEJO SELECCIONE nombre, META().cas DESDE `viaje-muestra` DONDE tipo="hotel" PEDIR POR META().cas DESC LÍMITE 2; |
que solía dar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span estilo="color: #ff0000">{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices": [ { "declaración_índice": "CREATE INDEX adv_type ON `viaje-muestra`(`tipo`)", "keyspace_alias": "viaje-muestra", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta". } ] } } }, "consulta": "SELECT name, META().cas FROM `viaje-muestra` WHERE type="hotel\" ORDER BY META().cas DESC LIMIT 2;" } ] }</span> |
ahora da
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 |
<span estilo="color: #339966">{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices_de_cobertura": [ { "propiedad_índice": "ORDEN pushdown, LIMIT pushdown", "declaración_índice": "CREATE INDEX adv_type_meta_self_casDESC_name ON `viaje-muestra`(`type`,meta(self).`cas` DESC,`name`)", "keyspace_alias": "viaje-muestra" } ], "índices": [ { "declaración_índice": "CREATE INDEX adv_type ON `viaje-muestra`(`tipo`)", "keyspace_alias": "viaje-muestra", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta". } ] } } }, "consulta": "SELECT name, META().cas\nFROM `travel-sample`\nWHERE type="hotel\"\nORDER BY META().cas DESC\nLIMIT 2;" } ] }</span> |
2. Aconsejamos ajustar el orden de las claves de índice para los predicados funcionales y de matriz
Este defecto ha modificado ligeramente las normas que teníamos antes:
- Eliminar la regla de claves de índice funcionales.
- Add rule “like” in the same position for scenario ” a like “%adv%”.This rule is applicable only when the pattern is of the type “%x”.If it is of the type “x%” the rule does not apply.
- Las claves de índice de los predicados funcionales siguen el orden EQ/in/LE/LT
Una consulta como:
1 |
aconsejar seleccionar * de shellTest donde longitud(a21) <= 3 y c21 = 3 y c22 > 30 |
utilizado para dar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span estilo="color: #ff0000">"resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices": [ { "declaración_índice": "CREATE INDEX adv_c21_c22_length_a21 ON `shellTest`(`c21`,`c22`,length((`a21`)))", "keyspace_alias": "shellTest", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta, 5. menor que/entre/mayor que, 9. índice de función". } ] } } }, "consulta": "actualización shellTest configure tipo=\"izquierda\" donde longitud(a21) < 3 y c21 = 3 y c22 > 30</span> |
ahora da
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span estilo="color: #339966">{ "resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices": [ { "declaración_índice": "CREATE INDEX adv_c21_length_a21_c22 ON `shellTest`(`c21`,length((`a21`)),`c22`)", "keyspace_alias": "shellTest", "recomendando_regla": "Las claves de índice siguen el orden de los tipos de predicado: 2. igualdad/nulo/falta, 4. no menor que/entre/no mayor que, 5. menor que/entre/mayor que." } ] }</span> <span estilo="color: #339966">} }, "consulta": "update shellTest set type=\"left\" where length(a21) 30" } ] } ]</span> |
3. Ajuste el orden de las claves de índice de la matriz en su condición SATISFIES
- Ponga los predicados del array en el orden de la condición SATISFIES.
- Para la disyunción en SATISFIES: obtenga los términos comunes -> elija el de menor prioridad -> (EQ<IN<LE<LT<IS NOT NULL< LIKE)
- Para la conjunción en SATISFIES: elija la menos prioritaria.
Las nuevas normas después de fix#2 y #3:
1: índice principal del array para unnest,
2: igualdad/nulo/falta,
3: en,
4: no menor que/entre/no mayor que,
5: menor que/mayor que,
6: filtro join derivado como clave principal,
7: no null/no missing/valued,
8: como,
9: predicado de unión no estático,
10:flavor para el índice parcial,
1 2 3 4 |
aconsejar SELECCIONE META(p).id, ARRAY_DISTINCT(SI FALTA(habitaciones[*].num,[])) DESDE shellTest AS p DONDE (guestCode = IFNULL($guestCode, '') O guestCode = '') Y checkinTime ENTRE $startTime Y $endTime |
utilizado para dar
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 |
<span estilo="color: #ff0000">"resultados": [ { "#operator": "Aconsejar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices_de_cobertura": [ { "declaración_índice": "CREATE INDEX adv_guestCode_checkinTime_DISTINCT_rooms_level_size_num_array_di1747996179 ON `shellTest`(`guestCode`,`checkinTime`,DISTINCT ARRAY [`s`.`level`, `s`.`size`, `s`.`num`] FOR s in `rooms` END,array_distinct(ifmissing((array_star((`rooms`)).`num`), []))", "keyspace_alias": "shellTest_p" } ], "índices": [ { "declaración_índice": "CREATE INDEX adv_guestCode_checkinTime_DISTINCT_rooms_level_size_num ON `shellTest`(`guestCode`,`checkinTime`,DISTINCT ARRAY [`s`.`level`, `s`.`size`, `s`.`num`] FOR s in `rooms` END)", "keyspace_alias": "shellTest_p", "recomendando_regla": " Las claves de índice siguen el orden de los tipos de predicado: 1. Clave principal común para la disyunción (2. igualdad/nulo/falta, 4. no menor que/entre/no mayor que, 6. predicado de matriz)." } ] } } }, "consulta": "SELECT META(p).id, ARRAY_DISTINCT(IFMISSING(rooms[*].num,[])) FROM shellTest AS p WHERE (guestCode = IFNULL($guestCode, '') OR guestCode = '') AND (checkinTime BETWEEN $startTime AND $endTime) AND (ANY s IN rooms SATISFIES [s.level,s.size, s.num] = [$level, $size, $num] END)". </span> |
ahora da:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span estilo="color: #339966">resultados": [ { "#operador": "Avisar", "consejos": { "#operator": "IndexAdvice", "adviseinfo": { "índices_recomendados": { "índices_de_cobertura": [ { "declaración_índice": "CREATE INDEX adv_guestCode_checkinTime_array_distinct_ifmissing_array_star_rooms_num ON `shellTest`(`guestCode`,`checkinTime`,array_distinct(ifmissing((array_star((`rooms`)).`num`), []))", "keyspace_alias": "shellTest_p" } ], "índices": [ { "declaración_índice": "CREATE INDEX adv_guestCode_checkinTime ON `shellTest`(`guestCode`,`checkinTime`)", "keyspace_alias": "shellTest_p", "recomendando_regla": " Las claves de índice siguen el orden de los tipos de predicado: 1. Clave principal común para la disyunción (2. igualdad/nulo/falta, 4. no menor que/entre/no mayor que)." } ] } } }</span> |
Pruébalo y cualquier problema que veas con los índices recomendados por Index Advisor Service, puedes añadirlo como comentario a este blog
Más información sobre la función Index Advisor:
https://www.couchbase.com/blog/index-advisor-service/
https://www.couchbase.com/blog/index-advisor-service-for-couchbase-n1qlfeb-refresh/
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