{"id":7370,"date":"2019-08-09T10:00:10","date_gmt":"2019-08-09T17:00:10","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7370"},"modified":"2023-05-19T04:44:06","modified_gmt":"2023-05-19T11:44:06","slug":"index-advisor-for-n1ql-query-statement","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/index-advisor-for-n1ql-query-statement\/","title":{"rendered":"Asesor de \u00edndices para la declaraci\u00f3n de consulta N1QL"},"content":{"rendered":"<h3>Visi\u00f3n general<\/h3>\n<p>Index advisor se introduce en Couchbase server 6.5 como una funci\u00f3n de vista previa para desarrolladores. Su objetivo es proporcionar recomendaciones de \u00edndices secundarios para ayudar a los administradores de bases de datos y desarrolladores a optimizar el rendimiento de las consultas N1QL. Esta versi\u00f3n est\u00e1 basada en reglas, en la que los \u00edndices candidatos ser\u00e1n generados siguiendo las reglas de dise\u00f1o especificadas en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/create-right-index-get-right-performance\/\">https:\/\/www.couchbase.com\/blog\/create-right-index-get-right-performance\/:<\/a><\/p>\n<p style=\"padding-left: 40px\">1. Clave de \u00edndice de matriz principal para unnest<\/p>\n<p style=\"padding-left: 40px\">2. Predicados de igualdad<\/p>\n<p style=\"padding-left: 40px\">3. Predicados IN<\/p>\n<p style=\"padding-left: 40px\">4. Predicados no menor que\/entre\/no mayor que<\/p>\n<p style=\"padding-left: 40px\">5. Predicados menor que\/mayor que<\/p>\n<p style=\"padding-left: 40px\">6. Predicados de matriz<\/p>\n<p style=\"padding-left: 40px\">7. Filtro de uni\u00f3n derivado como clave principal para el espacio de claves del lado izquierdo<\/p>\n<p style=\"padding-left: 40px\">8. Predicados IS NOT NULL\/MISSING\/VALUED<\/p>\n<p style=\"padding-left: 40px\">9. Predicados funcionales<\/p>\n<p style=\"padding-left: 40px\">10. Condici\u00f3n de \u00edndice parcial<\/p>\n<p>El asesor de \u00edndices est\u00e1 dise\u00f1ado para funcionar de dos maneras:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Declaraci\u00f3n N1QL para aconsejar \u00edndices para una sola consulta.<\/li>\n<li>Funci\u00f3n de asesor para aconsejar sobre la carga de trabajo de las consultas y apoyar la gesti\u00f3n de las sesiones.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Este art\u00edculo se centra en la primera funci\u00f3n y explica c\u00f3mo funciona internamente.<\/p>\n<h3>Detalles de la declaraci\u00f3n ADVISE<\/h3>\n<p>Sintaxis de la sentencia N1QL:<\/p>\n<p style=\"text-align: left;padding-left: 40px\">ADVISE [INDEX ]  (consulta)<\/p>\n<p>Admite los tipos de consulta SELECT\/DELETE\/UPDATE\/ANSI MERGE, y proporciona recomendaciones de \u00edndices para operaciones en un \u00fanico espacio de claves, ANSI JOIN\/NEST, INDEX JOIN\/NEST, UNNEST y subconsultas en la cl\u00e1usula FROM.<\/p>\n<p>Las principales directrices que sigue Index Advisor son:<\/p>\n<ol>\n<li style=\"list-style-type: none\">\n<ol>\n<li>Generar candidatos a \u00edndices secundarios basados en predicados indexables, proyecciones, expresiones GROUP BY\/ORDER BY con la sintaxis correcta.<\/li>\n<li>Ordene las claves de \u00edndice siguiendo las reglas con respecto al orden de prioridad de los tipos de predicado con ajuste en la clave de \u00edndice de matriz principal para UNNEST y filtro ISNOTNULL derivado para ANSI JOIN.<\/li>\n<li>Aseg\u00farese de que el \u00edndice recomendado sea superior a todos los \u00edndices actuales existentes o diferidos y sea seleccionado por el optimizador de consultas basado en reglas actuales en la ejecuci\u00f3n de la consulta.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Veamos primero el resultado de un ejemplo sencillo:<\/p>\n<p>Consulta 1:<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT name FROM `travel-sample` WHERE id &lt; 100 AND type = \u201croute\u201d<\/pre>\n<pre class=\"lang:default decode:true\">[\r\n  {\r\n    \"#operator\": \"Advise\",\r\n    \"advice\": {\r\n      \"#operator\": \"IndexAdvice\",\r\n      \"adviseinfo\": [\r\n        {\r\n          \"current_indexes\": [\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_type ON `travel-sample`(`type`)\"\r\n            }\r\n          ],\r\n          \"recommended_indexes\": {\r\n            \"covering_indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_id_type_name ON `travel-sample`(`id`,`name`) WHERE `type` = 'route'\"\r\n              }\r\n            ],\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_id_type ON `travel-sample`(`id`) WHERE `type` = 'route'\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 5. less than\/between\/greater than, 10. flavor for partial index.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"query\": \"select name from `travel-sample` where id &lt; 100 and type = \\\"route\\\";\"\r\n  }\r\n]\r\n<\/pre>\n<p>Hay dos partes en la salida de asesoramiento:<\/p>\n<ul>\n<li>\u00cdndices actuales:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px\">Esta sesi\u00f3n proporciona informaci\u00f3n sobre los \u00edndices utilizados actualmente por el optimizador de consultas para ejecutar la consulta de entrada. Tambi\u00e9n incluir\u00e1 informaci\u00f3n sobre el estado del \u00edndice si es id\u00e9ntico al \u00edndice recomendado o si se trata de un \u00edndice de cobertura \u00f3ptimo. En ambas situaciones, no se proporcionar\u00e1 ninguna recomendaci\u00f3n de \u00edndice.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\"><\/li>\n<\/ul>\n<\/li>\n<li>\u00cdndices recomendados:\n<ul>\n<li>\u00cdndices:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"padding-left: 40px\">Esta sesi\u00f3n enumera los \u00edndices recomendados en funci\u00f3n de los predicados de la cl\u00e1usula WHERE\/ON, junto con la regla de recomendaci\u00f3n correspondiente que sigue cada \u00edndice.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>\u00cdndices de cobertura:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"padding-left: 40px\">Esta sesi\u00f3n enumera los \u00edndices de cobertura aplicables a la consulta de entrada.<\/p>\n<h3>\u00cdndices parciales<\/h3>\n<p>El modelo de datos de Couchbase es JSON con un esquema flexible, y un bucket puede ser heterog\u00e9neo con m\u00faltiples tipos de documentos en su interior. Normalmente, las entradas de datos incluyen un campo \"tipo\" para su categorizaci\u00f3n. Cuando una consulta incluye filtros sobre un tipo particular de documentos, se dar\u00e1 un \u00edndice parcial con el campo \"tipo\" en la cl\u00e1usula WHERE. Esto puede ayudar a minimizar el tama\u00f1o del \u00edndice, acortar la ruta de acceso al \u00edndice y ejecutar la consulta de forma m\u00e1s eficiente.<\/p>\n<p>En el ejemplo de consulta anterior, el \u00edndice recomendado es un \u00edndice parcial con \"tipo = 'ruta'\" a\u00f1adido en la cl\u00e1usula WHERE, que s\u00f3lo crear\u00e1 un \u00edndice sobre los documentos de tipo \"ruta\":<\/p>\n<pre class=\"lang:default decode:true\">CREATE INDEX adv_id_type_name ON `travel-sample`(`id`,`name`) WHERE `type` = 'route'<\/pre>\n<p>Internamente, el asesor de \u00edndices utiliza las estad\u00edsticas \"flavor\" de la sentencia INFER para hacer coincidir los campos del predicado y a\u00f1adirlos a la condici\u00f3n del \u00edndice parcial.<\/p>\n<p>Para obtener m\u00e1s ideas, ejecutemos una consulta con ANSI JOIN sobre m\u00faltiples tipos de documentos en la que se aconsejar\u00e1 un \u00edndice parcial con el campo \"tipo\" como condici\u00f3n de \u00edndice para cada espacio clave:<\/p>\n<p>Consulta 2:<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT DISTINCT airline.name,\r\n                       airport.name AS airport,\r\n                       route.distance\r\nFROM `travel-sample` airport\r\nINNER JOIN `travel-sample` route ON airport.faa = route.sourceairport\r\n    AND route.type = \"route\"\r\nINNER JOIN `travel-sample` airline ON route.airline = airline.iata\r\n    AND airline.type = \"airline\"\r\nWHERE airport.type = \"airport\"\r\n    AND airport.city = \"San Jose\";<\/pre>\n<pre class=\"lang:default decode:true\">[\r\n    {\r\n        \"#operator\": \"Advise\",\r\n        \"advice\": {\r\n            \"#operator\": \"IndexAdvice\",\r\n            \"adviseinfo\": [\r\n                {\r\n                    \"recommended_indexes\": {\r\n                        \"covering_indexes\": [\r\n                            {\r\n                                \"index_statement\": \"CREATE INDEX adv_iata_type_name ON `travel-sample`(`iata`,`name`) WHERE `type` = 'airline'\"\r\n                            },\r\n                            {\r\n                                \"index_statement\": \"CREATE INDEX adv_city_type_faa_name ON `travel-sample`(`city`,`faa`,`name`) WHERE `type` = 'airport'\"\r\n                            },\r\n                            {\r\n                                \"index_statement\": \"CREATE INDEX adv_sourceairport_type_airline_distance ON `travel-sample`(`sourceairport`,`airline`,`distance`) WHERE `type` = 'route'\"\r\n                            }\r\n                        ],\r\n                        \"indexes\": [\r\n                            {\r\n                                \"index_statement\": \"CREATE INDEX adv_city_type ON `travel-sample`(`city`) WHERE `type` = 'airport'\",\r\n                                \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality, 10. flavor for partial index.\"\r\n                            },\r\n                            {\r\n                                \"index_statement\": \"CREATE INDEX adv_sourceairport_type ON `travel-sample`(`sourceairport`) WHERE `type` = 'route'\",\r\n                                \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality, 10. flavor for partial index.\"\r\n                            },\r\n                            {\r\n                                \"index_statement\": \"CREATE INDEX adv_iata_type ON `travel-sample`(`iata`) WHERE `type` = 'airline'\",\r\n                                \"recommending_rule\": \"Index keys follow order of predicate types: 2. equality, 10. flavor for partial index.\"\r\n                            }\r\n                        ]\r\n                    }\r\n                }\r\n            ]\r\n        },\r\n        \"query\": \"SELECT DISTINCT airline.name, airport.name AS airport, route.distance FROM `travel-sample` airport INNER JOIN `travel-sample` route ON airport.faa = route.sourceairport AND route.type = \\\"route\\\" INNER JOIN `travel-sample` airline ON route.airline = airline.iata AND airline.type = \\\"airline\\\" WHERE airport.type = \\\"airport\\\" AND airport.city = \\\"San Jose\\\";\"\r\n    }\r\n    ]<\/pre>\n<h3>\u00cdndice de matriz para predicado de matriz<\/h3>\n<p>JSON es una estructura jer\u00e1rquica compuesta por campos escalares anidados, objetos y matrices. La clave de \u00edndice de array puede profundizar en el array anidado y referenciar claramente los elementos o los campos del objeto que se necesita indexar. El asesor de \u00edndices recomendar\u00e1 el \u00edndice del array recorriendo recursivamente los enlaces y expresiones en <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/collectionops.html#collection-op-any\">CUALQUIER<\/a> predicado de rango.<\/p>\n<p>Consulta 3:<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT id\r\nFROM `travel-sample`\r\nWHERE type = \"route\"\r\n    AND ANY x IN schedule,\r\n             z IN schedule SATISFIES (ANY y IN x.day, w IN z.flight SATISFIES [y, w] &lt;[1, \"AF547\"] END) END;<\/pre>\n<pre class=\"lang:default decode:true\">[\r\n  {\r\n    \"#operator\": \"Advise\",\r\n    \"advice\": {\r\n      \"#operator\": \"IndexAdvice\",\r\n      \"adviseinfo\": [\r\n        {\r\n          \"recommended_indexes\": {\r\n            \"covering_indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_DISTINCT_schedule_schedule_day_flight_type_id ON `travel-sample`(DISTINCT ARRAY (DISTINCT ARRAY [y, w] FOR y in x.day, w in z.flight END) FOR x in schedule, z in schedule END,`id`) WHERE `type` = 'route'\"\r\n              }\r\n            ],\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_DISTINCT_schedule_schedule_day_flight_type ON `travel-sample`(DISTINCT ARRAY (DISTINCT ARRAY [y, w] FOR y in x.day, w in z.flight END) FOR x in schedule, z in schedule END) WHERE `type` = 'route'\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 6. array predicate, 10. flavor for partial index.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"query\": \"SELECT id FROM `travel-sample` WHERE type = \\\"route\\\" AND ANY x IN schedule, z IN schedule SATISFIES (ANY y IN x.day, w IN z.flight SATISFIES [y, w] &lt;[1, \\\"AF547\\\"] END) END;\"\r\n  }\r\n]<\/pre>\n<p>Dado que los usuarios tienen la flexibilidad de aplicar cualquier l\u00f3gica y procesamiento adicional sobre los elementos y campos del objeto en el array para generar <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/collectionops.html#collection-op-any\">CUALQUIER<\/a> Index advisor tambi\u00e9n se esforzar\u00e1 por dar soporte a aquellas funciones complejas, expresiones de array, condiciones booleanas, etc., tal y como se muestra en la siguiente consulta:<\/p>\n<p>Consulta 4:<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT *\r\nFROM products AS c\r\nWHERE ANY p IN OBJECT_PAIRS(c.productIds) \r\n            SATISFIES [p.name, ARRAY_COUNT(p.val) &gt; 0, c.metadata.configurations.[p.name].enabled, ARRAY_CONTAINS(IFMISSINGORNULL(c.deletedFor, []),p.name)] = [\\\"US\\\", TRUE, FALSE, FALSE] END<\/pre>\n<pre class=\"lang:default decode:true\">[\r\n  {\r\n    \"#operator\": \"Advise\",\r\n    \"advice\": {\r\n      \"#operator\": \"IndexAdvice\",\r\n      \"adviseinfo\": [\r\n        {\r\n          \"recommended_indexes\": {\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_DISTINCT_object_pairs_productIds_name_array_count_val_metada4251025607 ON `products`(DISTINCT ARRAY [p.name, 0 &lt; array_count((`p`.`val`)), metadata.configurations.[p.name].enabled, array_contains(ifmissingornull((`deletedFor`), []), (`p`.`name`))] FOR p in object_pairs((`productIds`)) END)\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 6. array predicate.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"query\": \"SELECT * FROM products AS c WHERE ANY p IN OBJECT_PAIRS(c.productIds) SATISFIES [p.name, ARRAY_COUNT(p.val) &gt; 0, c.metadata.configurations.[p.name].enabled, ARRAY_CONTAINS(IFMISSINGORNULL(c.deletedFor, []),p.name)] = [\\\"US\\\", TRUE, FALSE, FALSE] END;\"\r\n  }\r\n]<\/pre>\n<h3>\u00cdndice de matriz para la operaci\u00f3n UNNEST<\/h3>\n<p>UNNEST se utiliza para realizar una operaci\u00f3n de uni\u00f3n del array anidado con su objeto padre. Cuando el predicado de esta operaci\u00f3n se aplica a los elementos individuales del array anidado, un \u00edndice de array ayudar\u00e1 a optimizar la ejecuci\u00f3n de la consulta.<\/p>\n<p>El optimizador de consultas N1QL soporta el escaneo sin anidar y el escaneo de cobertura sin anidar cuando hay una clave de array principal apropiada con TODOS los elementos del array indexados en la definici\u00f3n del \u00edndice. El asesor de \u00edndices sigue esta regla para recoger las expresiones no anidadas y generar el \u00edndice del array de forma inversa para su recomendaci\u00f3n. Veamos el siguiente ejemplo:<\/p>\n<p>Consulta 5:<\/p>\n<pre class=\"lang:default decode:true\">ADVISE SELECT COUNT(*)\r\nFROM `travel-sample` t\r\nUNNEST schedule AS x\r\nUNNEST x.special_flights AS y\r\nWHERE y.flight IS NOT NULL\r\n    AND t.type = \"route\"<\/pre>\n<pre class=\"lang:default decode:true\">[\r\n  {\r\n    \"#operator\": \"Advise\",\r\n    \"advice\": {\r\n      \"#operator\": \"IndexAdvice\",\r\n      \"adviseinfo\": [\r\n        {\r\n          \"recommended_indexes\": {\r\n            \"covering_indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_ALL_schedule_special_flights_flight_type ON `travel-sample`(ALL ARRAY (ALL ARRAY y.flight FOR y IN x.special_flights END) FOR x IN schedule END,`type`)\"\r\n              }\r\n            ],\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_ALL_schedule_special_flights_flight_type ON `travel-sample`(ALL ARRAY (ALL ARRAY y.flight FOR y IN x.special_flights END) FOR x IN schedule END,`type`)\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 1. leading array index for unnest, 2. equality.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"query\": \"SELECT COUNT(*)\\nFROM `travel-sample` t\\nUNNEST schedule AS x\\nUNNEST x.special_flights AS y\\nWHERE y.flight IS NOT NULL\\n    AND t.type = \\\"route\\\"\"\r\n  }\r\n]<\/pre>\n<h3>\u00cdndices de cobertura<\/h3>\n<p>Los \u00edndices de cobertura pueden proporcionar todos los datos necesarios para una consulta concreta y evitar la sobrecarga que supone obtener documentos del servicio de datos. El asesor de \u00edndices recomendar\u00e1 este \u00edndice de cobertura eficiente para la consulta de entrada, si procede, en los pasos siguientes:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>En primer lugar, recopile las claves de \u00edndice de todos los predicados de la cl\u00e1usula WHERE\/ON.<\/li>\n<li>A continuaci\u00f3n, a\u00f1ada las expresiones de proyecci\u00f3n y GROUP BY\/ORDER BY restantes a la definici\u00f3n del \u00edndice y genere un candidato a \u00edndice de cobertura provisional.<\/li>\n<li>Por \u00faltimo, pero no por ello menos importante, compruebe si las expresiones de \u00edndice pueden proporcionar todos los datos necesarios para cubrir la consulta utilizando el mismo enfoque que para el optimizador de consultas.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Los ejemplos de consulta anteriores han mostrado que los \u00edndices de cobertura y los \u00edndices de matriz de cobertura se proporcionan para la consulta de espacio de clave \u00fanica, la operaci\u00f3n JOIN, las expresiones ANY y los predicados UNNEST.<\/p>\n<h3>Convenci\u00f3n de nomenclatura de \u00edndices<\/h3>\n<p><span style=\"font-weight: 400\">En el asesor de \u00edndices, el nombre del \u00edndice est\u00e1 dise\u00f1ado para cumplir tres requisitos:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none\">\n<ol>\n<li>Refleje la construcci\u00f3n del \u00edndice conectando todas las claves del \u00edndice con gui\u00f3n bajo.<\/li>\n<li>Se diferencia de los \u00edndices definidos por el usuario a\u00f1adiendo el prefijo \"adv-\".<\/li>\n<li>Longitud razonable truncando y sustituyendo por c\u00f3digo hash.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>A continuaci\u00f3n se enumeran los formatos para el \u00edndice normal y el \u00edndice de matriz:<\/p>\n<ul>\n<li>adv_field1_field2_field3...<\/li>\n<li>adv_[DISTINTO\/ALL]_nivel1_nivel2_nivel3...<\/li>\n<\/ul>\n<p>Los nombres duplicados no est\u00e1n soportados en la indexaci\u00f3n de Couchbase, y el asesor de \u00edndices no garantiza la unicidad del nombre del \u00edndice en la recomendaci\u00f3n.  Los usuarios necesitan cambiar el nombre del \u00edndice al encontrar este error.<\/p>\n<h3>Resumen<\/h3>\n<p>El asesor de \u00edndices (sentencia ADVISE) proporciona recomendaciones de \u00edndices para una \u00fanica consulta. Aconseja el \u00edndice regular, el \u00edndice parcial, el \u00edndice de matriz y el \u00edndice de cobertura, y proporciona informaci\u00f3n sobre la regla de recomendaci\u00f3n correspondiente que sigue cada clave de \u00edndice.  Adem\u00e1s, eval\u00faa los \u00edndices utilizados actualmente en una consulta y evita hacer recomendaciones innecesarias.<\/p>\n<p>Lanzado como funci\u00f3n DP, el asesor de \u00edndices se encuentra a\u00fan en su fase inicial. Su funcionalidad y facilidad de uso se seguir\u00e1n mejorando para satisfacer mejor las necesidades de los clientes y contribuir a la optimizaci\u00f3n de las consultas.<\/p>\n<h3><b>Recursos<\/b><\/h3>\n<ul>\n<li><i>Descargar<\/i>:\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=server&amp;product=couchbase-server-developer\">Descargar Couchbase Server 6.5<\/a><i><\/i><\/li>\n<li><i>Documentaci\u00f3n<\/i>:\u00a0<a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html\">Novedades de Couchbase Server 6.5<\/a><i><\/i><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/6-5\/\"><b>Todos los blogs de 6.5<\/b><\/a><\/li>\n<\/ul>\n<p>Nos encantar\u00eda que nos dijera qu\u00e9 le han parecido las funciones de la versi\u00f3n 6.5 y en qu\u00e9 beneficiar\u00e1n a su empresa en el futuro. Por favor, comparta su opini\u00f3n a trav\u00e9s de los comentarios o en el\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">foro<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Overview Index advisor is introduced in Couchbase server 6.5 as a developer preview feature. It targets at providing secondary index recommendation to help DBAs and developers optimize N1QL query performance. This version is rule-based, in which the index candidates will [&hellip;]<\/p>","protected":false},"author":17714,"featured_media":7449,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1812],"tags":[2378],"ppma_author":[9088],"class_list":["post-7370","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-n1ql-query","tag-6-5"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Index Advisor for N1QL Query Statement - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/index-advisor-for-n1ql-query-statement\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Index Advisor for N1QL Query Statement\" \/>\n<meta property=\"og:description\" content=\"Overview Index advisor is introduced in Couchbase server 6.5 as a developer preview feature. It targets at providing secondary index recommendation to help DBAs and developers optimize N1QL query performance. This version is rule-based, in which the index candidates will [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/index-advisor-for-n1ql-query-statement\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-09T17:00:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-19T11:44:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/08\/Transactions-alternative-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1400\" \/>\n\t<meta property=\"og:image:height\" content=\"553\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Chang Liu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chang Liu\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/\"},\"author\":{\"name\":\"Chang Liu\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c43360951567e4b3bef754197f5e866b\"},\"headline\":\"Index Advisor for N1QL Query Statement\",\"datePublished\":\"2019-08-09T17:00:10+00:00\",\"dateModified\":\"2023-05-19T11:44:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/\"},\"wordCount\":1132,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg\",\"keywords\":[\"6.5\"],\"articleSection\":[\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/\",\"name\":\"Index Advisor for N1QL Query Statement - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg\",\"datePublished\":\"2019-08-09T17:00:10+00:00\",\"dateModified\":\"2023-05-19T11:44:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg\",\"width\":1400,\"height\":553},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Index Advisor for N1QL Query Statement\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c43360951567e4b3bef754197f5e866b\",\"name\":\"Chang Liu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/2eede623c7ed061e0426183cb9cac122\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d73d8b19010a13d5e2567a4051ea99cf60a37f9ff39d8197255739d72a030b3b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d73d8b19010a13d5e2567a4051ea99cf60a37f9ff39d8197255739d72a030b3b?s=96&d=mm&r=g\",\"caption\":\"Chang Liu\"},\"description\":\"Software Engineer in N1QL Query Team\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/chang-liucouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Index Advisor for N1QL Query Statement - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/index-advisor-for-n1ql-query-statement\/","og_locale":"es_MX","og_type":"article","og_title":"Index Advisor for N1QL Query Statement","og_description":"Overview Index advisor is introduced in Couchbase server 6.5 as a developer preview feature. It targets at providing secondary index recommendation to help DBAs and developers optimize N1QL query performance. This version is rule-based, in which the index candidates will [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/index-advisor-for-n1ql-query-statement\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-08-09T17:00:10+00:00","article_modified_time":"2023-05-19T11:44:06+00:00","og_image":[{"width":1400,"height":553,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/08\/Transactions-alternative-1.jpg","type":"image\/jpeg"}],"author":"Chang Liu","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Chang Liu","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/"},"author":{"name":"Chang Liu","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c43360951567e4b3bef754197f5e866b"},"headline":"Index Advisor for N1QL Query Statement","datePublished":"2019-08-09T17:00:10+00:00","dateModified":"2023-05-19T11:44:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/"},"wordCount":1132,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg","keywords":["6.5"],"articleSection":["Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/","url":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/","name":"Index Advisor for N1QL Query Statement - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg","datePublished":"2019-08-09T17:00:10+00:00","dateModified":"2023-05-19T11:44:06+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/08\/Transactions-alternative-1.jpg","width":1400,"height":553},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/index-advisor-for-n1ql-query-statement\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Index Advisor for N1QL Query Statement"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c43360951567e4b3bef754197f5e866b","name":"Chang Liu","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/2eede623c7ed061e0426183cb9cac122","url":"https:\/\/secure.gravatar.com\/avatar\/d73d8b19010a13d5e2567a4051ea99cf60a37f9ff39d8197255739d72a030b3b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d73d8b19010a13d5e2567a4051ea99cf60a37f9ff39d8197255739d72a030b3b?s=96&d=mm&r=g","caption":"Chang Liu"},"description":"Ingeniero de software en el equipo de consulta N1QL","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/chang-liucouchbase-com\/"}]}},"authors":[{"term_id":9088,"user_id":17714,"is_guest":0,"slug":"chang-liucouchbase-com","display_name":"Chang Liu","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/d73d8b19010a13d5e2567a4051ea99cf60a37f9ff39d8197255739d72a030b3b?s=96&d=mm&r=g","author_category":"","last_name":"Liu","first_name":"Chang","job_title":"","user_url":"","description":"Ingeniero de software en el equipo de consulta N1QL"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/17714"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=7370"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7370\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/7449"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=7370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=7370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=7370"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=7370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}