{"id":6764,"date":"2019-05-09T08:47:43","date_gmt":"2019-05-09T15:47:43","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=6764"},"modified":"2025-06-13T20:19:36","modified_gmt":"2025-06-14T03:19:36","slug":"n1ql-index-advisor-improve-query-performance-and-productivity","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-index-advisor-improve-query-performance-and-productivity\/","title":{"rendered":"N1QL Index Advisor: Melhore o desempenho e a produtividade das consultas"},"content":{"rendered":"<p>Como desenvolvedores de aplicativos, seu foco principal \u00e9 projetar as consultas mais eficientes para o seu aplicativo. Voc\u00ea quer garantir a integridade dos dados que o aplicativo envia para o banco de dados e criar as consultas mais eficientes para recuperar os dados necess\u00e1rios para o aplicativo. Em muitos casos, o desempenho do aplicativo \u00e9 adiado para um est\u00e1gio posterior do ciclo de desenvolvimento. Muitas vezes, isso \u00e9 deixado para os especialistas em desempenho de banco de dados, que podem fornecer as recomenda\u00e7\u00f5es para o design do \u00edndice, que tamb\u00e9m pode incluir a reescrita da consulta, a fim de atender aos requisitos de desempenho. No entanto, compreender o desempenho da consulta pode aumentar muito a produtividade e ajudar os desenvolvedores a buscar uma solu\u00e7\u00e3o de melhor desempenho no in\u00edcio do ciclo de desenvolvimento.<\/p>\n<p>Os fornecedores de banco de dados entendem esse desafio e os RDBMSs de classe empresarial incluem o recurso de ajuste de desempenho como parte de seus conjuntos de ferramentas de banco de dados.<\/p>\n<p>O Couchbase N1QL Index Advisor, um novo recurso do Couchbase 6.5 (DP), agora fornece recomenda\u00e7\u00f5es de \u00edndices GSI para instru\u00e7\u00f5es de consulta N1QL. Seu principal objetivo \u00e9 recomendar o \u00edndice para otimizar o tempo de resposta da consulta. Isso permite que os desenvolvedores se tornem mais produtivos, pois podem criar o(s) \u00edndice(s) recomendado(s) e ver o desempenho da consulta no in\u00edcio do ciclo de desenvolvimento. Tamb\u00e9m permite que os DBAs melhorem o desempenho do sistema revisando periodicamente as consultas de execu\u00e7\u00e3o lenta.<\/p>\n<p>Voc\u00ea pode aprender a usar o Couchbase Index Advisor lendo o <strong><em>Entendendo o Index Advisor<\/em><\/strong> e <strong><em>Comece a usar o Index Advisor<\/em><\/strong> se\u00e7\u00f5es abaixo. As se\u00e7\u00f5es restantes fornecem mais detalhes sobre como o Index Advisor chega \u00e0s recomenda\u00e7\u00f5es, incluindo dicas sobre como usar o Index Advisor em solicita\u00e7\u00f5es conclu\u00eddas e como identificar \u00edndices usados com pouca frequ\u00eancia.<\/p>\n<h3><b>Entendendo o Index Advisor<\/b><\/h3>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/5-steps-to-better-database-performance\/\">Desempenho do banco de dados<\/a>Embora seja uma tarefa dif\u00edcil de gerenciar bem, \u00e9 um problema bem compreendido pelos fornecedores de bancos de dados. O advento do SaaS e do DBasS tamb\u00e9m significa que o desafio do desempenho do banco de dados \u00e9 apenas parte do servi\u00e7o e precisa ser automatizado em rela\u00e7\u00e3o \u00e0 sua capacidade de diagnosticar e corrigir o problema. Nossa equipe de desenvolvimento tem trabalhado arduamente para criar os blocos de constru\u00e7\u00e3o para essa vis\u00e3o.<\/p>\n<p>O Couchbase Index Advisor faz parte da constru\u00e7\u00e3o N1QL ADVISE que permite que os desenvolvedores e DBAs gerenciem o aspecto de ajuste de desempenho de seus aplicativos. Para entender como o Index Advisor funciona, voc\u00ea precisa entender as principais t\u00e9cnicas de recupera\u00e7\u00e3o de dados na plataforma de dados do Couchbase:<\/p>\n<ul>\n<li>Chave-valor - Um acesso r\u00e1pido e direto aos dados para o servi\u00e7o de dados quando as chaves est\u00e3o dispon\u00edveis. Esse m\u00e9todo de acesso n\u00e3o envolve o servi\u00e7o de indexa\u00e7\u00e3o do Couchbase.<\/li>\n<li>Servi\u00e7o de indexa\u00e7\u00e3o (GSI) - Um servi\u00e7o dimension\u00e1vel que permite que os aplicativos executem consultas N1QL r\u00e1pidas. O GSI aproveita uma arquitetura distribu\u00edda e armazena os \u00edndices em um conjunto independente de n\u00f3s no cluster do Couchbase.<\/li>\n<li>Pesquisa (FTS) - Um servi\u00e7o de pesquisa de texto completo que oferece pesquisa por palavra-chave e pesquisa difusa. O FTS, como todos os servi\u00e7os do Couchbase, \u00e9 um servi\u00e7o distribu\u00eddo que pode ser configurado no cluster do Couchbase.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6768\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-24-at-4.31.54-PM.png\" alt=\"\" width=\"673\" height=\"252\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-4.31.54-PM.png 1020w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-4.31.54-PM-300x112.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-4.31.54-PM-768x288.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-4.31.54-PM-20x7.png 20w\" sizes=\"auto, (max-width: 673px) 100vw, 673px\" \/><\/p>\n<p>O N1QL Query aproveita todos os servi\u00e7os acima para fornecer o resultado da consulta aos aplicativos. No entanto, o Index Advisor na vers\u00e3o 6.5 (DP) recomenda apenas os \u00edndices gerenciados pelo servi\u00e7o Index (GSI). O Index Advisor n\u00e3o avalia a t\u00e9cnica de recupera\u00e7\u00e3o do servi\u00e7o Data por meio de USE KEYS, nem o servi\u00e7o Search (FTS) por meio da fun\u00e7\u00e3o N1QL SEARCH_QUERY() e SEARCH().<\/p>\n<h3><b>Comece a usar o Index Advisor<\/b><\/h3>\n<p>Como mencionei anteriormente, o Index Advisor \u00e9 o primeiro de uma s\u00e9rie de recursos que apresentamos para o ajuste de desempenho do banco de dados. O Index Advisor ajuda a identificar sistematicamente os \u00edndices que podem otimizar o desempenho do aplicativo e a garantir que os \u00edndices sejam criados usando a pr\u00e1tica recomendada para a ordem das chaves. Na verdade, o Index Advisor pode oferecer recomenda\u00e7\u00f5es mesmo quando voc\u00ea j\u00e1 tem \u00edndices em funcionamento para suas consultas.<\/p>\n<p>Voc\u00ea pode come\u00e7ar a usar o N1QL Index Advisor usando:<\/p>\n<h4>N1QL - ADVISE [INDEX]<\/h4>\n<pre class=\"lang:mysql decode:true\">ADVISE\u00a0 SELECT route.destinationairport\r\n   FROM `travel-sample` airport\u00a0\u00a0\u00a0 \r\n     JOIN `travel-sample` route ON airport.faa = route.sourceairport\u00a0\u00a0\u00a0 \r\n         AND route.type = \"route\"\r\n    WHERE airport.type = \"airport\"\u00a0\u00a0\u00a0 \r\n      AND airport.city = \"San Francisco\"\u00a0\u00a0\u00a0 \r\n      AND airport.country = \"United States\";<\/pre>\n<pre class=\"lang:js 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_city ON `travel-sample`(`city`)\"\r\n            },\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_type ON `travel-sample`(`type`)\"\r\n            },\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_faa ON `travel-sample`(`faa`)\"\r\n            },\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_route_src_dst_day ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = 'route')\",\r\n              \"index_status\": \"THIS IS AN OPTIMAL COVERING INDEX.\"\r\n            }\r\n          ],\r\n          \"recommended_indexes\": {\r\n            \"covering_indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_faa_country_city_type ON `travel-sample`(`faa`,`country`,`city`) WHERE `type` = 'airport'\"\r\n              }\r\n            ],\r\n            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_faa_country_city_type ON `travel-sample`(`faa`,`country`,`city`) WHERE `type` = 'airport'\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 1. equality, 8. flavor for partial index.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"query\": \"SELECT route.destinationairport\\nFROM `travel-sample` airport\\n    JOIN `travel-sample` route ON airport.faa = route.sourceairport\\n    AND route.type = \\\"route\\\"\\nWHERE airport.type = \\\"airport\\\"\\n    AND airport.city = \\\"San Francisco\\\"\\n    AND airport.country = \\\"United States\\\";\"\r\n  }\r\n]<\/pre>\n<p><strong>\u00cdndices atuais -\u00a0<\/strong>A se\u00e7\u00e3o lista todos os \u00edndices existentes que o planejador de consultas usar\u00e1 para essa consulta. Ela tamb\u00e9m fornece informa\u00e7\u00f5es adicionais sobre qualquer \u00edndice que o planejador de consultas use como \u00edndice de cobertura.<\/p>\n<p><strong>\u00cdndices recomendados -\u00a0<\/strong>Esta se\u00e7\u00e3o lista todos os \u00edndices recomendados pelo Index Advisor. As recomenda\u00e7\u00f5es de \u00edndice de cobertura s\u00e3o aquelas que permitiriam que a consulta funcionasse sem a busca adicional do servi\u00e7o de dados. J\u00e1 a se\u00e7\u00e3o de \u00edndices mostra apenas aqueles que ajudam com a cl\u00e1usula de predicado. Observe que pode haver duplica\u00e7\u00e3o de informa\u00e7\u00f5es nessas duas se\u00e7\u00f5es, mas onde o nome do \u00edndice seria id\u00eantico e onde as chaves do \u00edndice s\u00e3o as mesmas.<\/p>\n<p>Ele tamb\u00e9m fornece o motivo pelo qual recomendou os \u00edndices.<\/p>\n<h4>Usar o Advise no Query Workbench<\/h4>\n<p>Clique no bot\u00e3o Advise para obter a sa\u00edda do Index Advisor para a consulta.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6765\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-24-at-1.26.42-PM.png\" alt=\"\" width=\"980\" height=\"535\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.26.42-PM.png 1279w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.26.42-PM-300x164.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.26.42-PM-1024x559.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.26.42-PM-768x419.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.26.42-PM-20x11.png 20w\" sizes=\"auto, (max-width: 980px) 100vw, 980px\" \/><\/p>\n<p>O N1QL ADVISE oferece suporte a consultas para SELECT, DELETE, UPDATE e MERGE. Ele fornece recomenda\u00e7\u00f5es de \u00edndices para:<\/p>\n<ul>\n<li>Cl\u00e1usula Predicate WHERE.<\/li>\n<li>Cl\u00e1usula ON de condi\u00e7\u00e3o de uni\u00e3o para uni\u00e3o de \u00edndices, uni\u00e3o ANSI, Index NEST, ANSI NEST e ANSI MERGE.<\/li>\n<li>\u00cdndice de matriz para UNNEST e predicados de matriz na cl\u00e1usula WHERE\/ON.<\/li>\n<li>Sub-Query quando usado na cl\u00e1usula FROM.<\/li>\n<\/ul>\n<h3><b>Como funciona o Index Advisor<\/b><\/h3>\n<p>Usarei a seguinte abordagem para explicar como o Index Advisor funciona.<\/p>\n<ol>\n<li>Selecionarei um exemplo que tem as constru\u00e7\u00f5es de consulta t\u00edpicas (predicado, uni\u00e3o, matriz, grupo por), que podem ser dif\u00edceis de adivinhar quais s\u00e3o os melhores \u00edndices para a consulta.<\/li>\n<li>Examine o plano de consulta para entender o que o otimizador faria com a consulta atual.<\/li>\n<li>Determinar manualmente quais \u00edndices devem ser criados para melhorar o desempenho da consulta. Isso se basearia no entendimento de um desenvolvedor de aplicativos t\u00edpico sobre \u00edndices de campo de predicado e uni\u00e3o.<\/li>\n<li>Em seguida, execute o Couchbase Index Advisor e compare suas recomenda\u00e7\u00f5es com as que t\u00ednhamos em mente.<\/li>\n<li>Crie os \u00edndices recomendados.<\/li>\n<li>Revise o novo plano de consulta e avalie as altera\u00e7\u00f5es.<\/li>\n<\/ol>\n<h5><strong>A consulta de exemplo<\/strong><\/h5>\n<p>Essa consulta recupera o n\u00famero de rotas de companhias a\u00e9reas de qualquer aeroporto da cidade de San Jose, EUA, que t\u00eam voos programados para o domingo.<\/p>\n<pre class=\"lang:default decode:true\">SELECT airline.name, airport.airportname, COUNT(1)\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\"\r\n    AND airport.country = \"United States\"\r\n    AND ANY x in route.schedule SATISFIES x.day =0 END\r\nGROUP BY airline.name, airport.airportname<\/pre>\n<h5><strong>O plano de consulta\u00a0<\/strong><\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6827\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM.png\" alt=\"\" width=\"1256\" height=\"438\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM.png 1256w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM-300x105.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM-1024x357.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM-768x268.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM-800x280.png 800w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-9.32.21-AM-20x7.png 20w\" sizes=\"auto, (max-width: 1256px) 100vw, 1256px\" \/><\/p>\n<ol>\n<li>A consulta usou cinco \u00edndices\n<ol>\n<li>Tr\u00eas \u00edndices foram usados para os predicados no tipo de documento \"aeroporto\": \"cidade\", \"tipo\" e \"faa\".<\/li>\n<li>Um \u00edndice foi usado para o tipo de documento \"route\" no campo \"sourceairport\" para fins de uni\u00e3o entre \"route\" e \"airport\". Nesse caso, foi usado o \u00edndice existente \"def_route_src_dst_day\" porque ele tem a chave principal \"sourceairport\".<\/li>\n<li>Um \u00edndice para o tipo de documento 'airline', que \u00e9 o \u00edndice parcial padr\u00e3o para 'type'.<\/li>\n<\/ol>\n<\/li>\n<li>Duas uni\u00f5es NestedLoop de documentos - \"aeroporto\" - \"rota\" e \"rota\" - \"companhia a\u00e9rea\".  Mas, al\u00e9m do \u00edndice 'def_route_src_dst_day' em 'route', n\u00e3o h\u00e1 outros \u00edndices para suportar o restante das uni\u00f5es. Portanto, essas uni\u00f5es n\u00e3o s\u00e3o eficientes.<\/li>\n<li>Houve tamb\u00e9m uma agrega\u00e7\u00e3o final para contar o n\u00famero de rotas por companhia a\u00e9rea.<\/li>\n<li>A consulta foi conclu\u00edda em 2,1s<\/li>\n<\/ol>\n<h5><strong>Como podemos melhorar o desempenho da consulta?<\/strong><\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6849\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/05\/Screen-Shot-2019-05-06-at-2.28.15-PM.png\" alt=\"\" width=\"730\" height=\"252\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-06-at-2.28.15-PM.png 730w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-06-at-2.28.15-PM-300x104.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-06-at-2.28.15-PM-20x7.png 20w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/p>\n<ol>\n<li>O documento \"airport\" tem dois predicados (\"city\" e \"country\") e um predicado de sabor em \"type\". Al\u00e9m disso, a coluna \"faa\" do aeroporto tamb\u00e9m \u00e9 usada para a uni\u00e3o com \"route\". Portanto, em vez de usar tr\u00eas \u00edndices separados, deve haver um \u00edndice parcial no documento \"airport\" para (\"city\", \"country\") [action_1]. O campo \"airport.faa\" tamb\u00e9m poderia se beneficiar com um \u00edndice separado ou parte do \u00edndice principal do aeroporto.<\/li>\n<li>O documento 'route' n\u00e3o tem predicados, mas tem uma uni\u00e3o com 'airport' com o campo 'sourceairport'. Um \u00edndice nessa coluna deve ajudar na uni\u00e3o, e j\u00e1 temos o \u00edndice 'def_route_src_dst_day' [action_2], portanto, nenhuma a\u00e7\u00e3o \u00e9 necess\u00e1ria para essa uni\u00e3o.<\/li>\n<li>O documento \"route\" tamb\u00e9m tem uma jun\u00e7\u00e3o com \"airline\" no campo \"airline\". Portanto, devemos ter um \u00edndice para isso - documento 'route' ('airline') [action_3].<\/li>\n<li>O documento \"airline\" tamb\u00e9m n\u00e3o tem nenhum predicado, mas tem uma jun\u00e7\u00e3o com \"route\" com o campo \"iata\". Portanto, \u00e9 necess\u00e1rio outro \u00edndice no documento \"airline\" (\"iata\") [action_4].<\/li>\n<li>Temos um predicado na matriz route.schedule. Portanto, tamb\u00e9m precisamos de um \u00edndice para isso. 'route' document (DISTINCT ARRAY x.day FOR x in schedule END) [action_5].<\/li>\n<\/ol>\n<p>Portanto, chegamos a cinco pontos de a\u00e7\u00e3o, que resultam em quatro \u00edndices adicionais para essa consulta.  Vamos ver o que o Index Advisor recomenda.<\/p>\n<h5><strong>Execute o Index Advisor para verificar o resultado<\/strong><\/h5>\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_city ON `travel-sample`(`city`)\"\r\n            },\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_type ON `travel-sample`(`type`)\"\r\n            },\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_faa ON `travel-sample`(`faa`)\"\r\n            },\r\n            {\r\n              \"index_statement\": \"CREATE INDEX def_route_src_dst_day ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = 'route')\"\r\n            },\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_faa_city_country_type_airportname ON `travel-sample`(`faa`,`city`,`country`,`airportname`) WHERE `type` = 'airport'\"\r\n              },\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            \"indexes\": [\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_country_faa_city_type ON `travel-sample`(`country`,`faa`,`city`) WHERE `type` = 'airport'\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 1. equality, 8. flavor for partial index.\"\r\n              },\r\n              {\r\n                \"index_statement\": \"CREATE INDEX adv_airline_sourceairport_DISTINCT_schedule_day_type ON `travel-sample`(`airline`,`sourceairport`,DISTINCT ARRAY x.day FOR x in schedule END) WHERE `type` = 'route'\",\r\n                \"recommending_rule\": \"Index keys follow order of predicate types: 1. equality, 5. array predicate, 8. 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: 1. equality, 8. flavor for partial index.\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"query\": \"SELECT airline.name, airport.airportname, COUNT(1)\\nFROM `travel-sample` airport\\nINNER JOIN `travel-sample` route ON airport.faa = route.sourceairport\\n    AND route.type = \\\"route\\\"\\nINNER JOIN `travel-sample` airline ON route.airline = airline.iata\\n    AND airline.type = \\\"airline\\\"\\nWHERE airport.type = \\\"airport\\\"\\n    AND airport.city = \\\"San Jose\\\"\\n    AND airport.country = \\\"United States\\\"\\n    AND ANY x in route.schedule SATISFIES x.day =0 END\\nGROUP BY airline.name, airport.airportname\"\r\n  }\r\n]<\/pre>\n<h5><strong>Se\u00e7\u00e3o \u00cdndices atuais<\/strong><\/h5>\n<p>Isso \u00e9 o mesmo que o plano nos forneceu. A consulta usa cinco \u00edndices.<\/p>\n<h5><strong>Se\u00e7\u00e3o de \u00edndices recomendados - \"\u00cdndices\"<\/strong><\/h5>\n<p>Esta se\u00e7\u00e3o lista todos os \u00edndices da perspectiva do predicado. Observe que JOIN tem campos ON, que tamb\u00e9m s\u00e3o tratados como predicados. Ent\u00e3o, vamos revisar os \u00edndices recomendados.<\/p>\n<ol>\n<li>adv_country_faa_city_type ON `travel-sample`(`country`,`faa`,`city`) WHERE `type` = &#8216;airport&#8217; &#8211; Other than the key order, this is the same index as we have identified in [action_1]. The key order is not significant here as these predicates all use equality.<\/li>\n<li>adv_airline_sourceairport_DISTINCT_schedule_day_type ON `travel-sample`(`airline`,`sourceairport`,DISTINCT ARRAY x.day FOR x in schedule END) WHERE `type` = &#8216;route&#8217; &#8211; What Index Advisor has done here is that it has combined [action_2, action_3, action_5] into a single index.<\/li>\n<li>adv_iata_type ON `travel-sample`(`iata`) WHERE `type` = &#8216;airline&#8217; &#8211; This is the same index that we had identified in [action_4]<\/li>\n<\/ol>\n<p><strong>Se\u00e7\u00e3o de \u00edndices recomendados - \"Cobrindo \u00edndices\"<\/strong><\/p>\n<p>Esta se\u00e7\u00e3o lista todas as recomenda\u00e7\u00f5es de \u00edndices de cobertura. Observe que <strong><em>Os \u00edndices de cobertura s\u00e3o aqueles usados para satisfazer uma consulta em um documento em que a execu\u00e7\u00e3o n\u00e3o precisaria realizar uma busca adicional no servi\u00e7o de dados<\/em><\/strong>.<\/p>\n<ol>\n<li>adv_faa_city_country_type_airportname_airportname ON `travel-sample`(`country`,`faa`,`city`,`airportname`) WHERE `type` = &#8216;airport&#8217;\u00a0 &#8211;\u00a0 Index Advisor has added the route.airportname field to the recommended index [adv_country_faa_city_type ON `travel-sample`(`country`,`faa`,`city`)]. By doing this, the query service would not need to fetch the route document from the data service to project the route.airportname<\/li>\n<li>adv_iata_type_name_name ON `travel-sample`(`iata`,`name`) WHERE `type` = &#8216;airline&#8217; &#8211; Index Advisor has added the airline.name to the recommended index [adv_iata_type ON `travel-sample`(`iata`) WHERE `type` = &#8216;airline&#8217;]. By doing this, the query service would not need to fetch the airline document from the data service to project the airline.name<\/li>\n<\/ol>\n<p><span style=\"text-decoration: underline\"><strong>Observa\u00e7\u00e3o<\/strong><\/span>:  O \u00edndice de cobertura reduz a necessidade de o servi\u00e7o de consulta realizar buscas adicionais no servi\u00e7o de dados, melhorando assim o desempenho da consulta. Mas o usu\u00e1rio precisa decidir se deve ou n\u00e3o criar \u00edndices de cobertura com base nas restri\u00e7\u00f5es espec\u00edficas, como mem\u00f3ria ou armazenamento do ambiente do usu\u00e1rio.<\/p>\n<h5><strong>Criar todos os \u00edndices recomendados e revisar o novo plano de consulta<\/strong><\/h5>\n<p>Para este exerc\u00edcio, decidi criar todos os \u00edndices recomendados usando \u00edndices de cobertura quando aplic\u00e1vel.<\/p>\n<pre class=\"lang:default decode:true\">CREATE INDEX `adv_faa_city_type_country_airportname` ON `travel-sample`(`faa`,`city`,`airportname`) WHERE ((`type` = \"airport\") and (`country` = \"United States\"))\r\n\r\nCREATE INDEX `adv_sourceairport_airline_DISTINCT_schedule_day_type` ON `travel-sample`(`sourceairport`,`airline`,(distinct (array (`x`.`day`) for `x` in `schedule` end))) WHERE (`type` = \"route\")\r\n\r\nCREATE INDEX `adv_iata_type_name` ON `travel-sample`(`iata`,`name`) WHERE (`type` = \"airline\")\r\n\r\n<\/pre>\n<h5><strong>O plano de consulta depois de adicionar os \u00edndices recomendados<\/strong><\/h5>\n<h5><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6828\" style=\"color: #333333;font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 19px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/05\/Screen-Shot-2019-05-03-at-10.39.27-AM.png\" alt=\"\" width=\"1275\" height=\"393\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-10.39.27-AM.png 1275w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-10.39.27-AM-300x92.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-10.39.27-AM-1024x316.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-10.39.27-AM-768x237.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-05-03-at-10.39.27-AM-20x6.png 20w\" sizes=\"auto, (max-width: 1275px) 100vw, 1275px\" \/><\/h5>\n<ol>\n<li>A consulta agora usa os tr\u00eas novos \u00edndices recomendados pelo Index Advisor, em vez de cinco \u00edndices.<\/li>\n<li>Como criamos \u00edndices de cobertura, o servi\u00e7o de consulta n\u00e3o precisa mais fazer nenhuma busca adicional no servi\u00e7o de dados.<\/li>\n<li>A consulta agora foi conclu\u00edda em 120 ms. Uma melhoria de 94%.<\/li>\n<\/ol>\n<h3><b>Use o Index Advisor para analisar a carga de trabalho<\/b><\/h3>\n<h4>N1QL - ADVISOR( )<\/h4>\n<h5>O Index Advisor tamb\u00e9m pode ser chamado com a fun\u00e7\u00e3o ADVISOR(). Ela permite que os usu\u00e1rios:<\/h5>\n<ol>\n<li>Passe em v\u00e1rias consultas. SELECT ADVISOR(\"SELECT ...\", \"SELECT ..\", \"UPDATE...\");<\/li>\n<li>Passe uma subconsulta que retorne os comandos N1QL reais. Como a consulta retorna uma estrutura de documento json, voc\u00ea precisar\u00e1 usar a palavra-chave RAW para garantir que somente os comandos N1QL reais sejam retornados.<\/li>\n<\/ol>\n<h5>Use ADVISOR() para identificar as consultas lentas, consultando as solicita\u00e7\u00f5es conclu\u00eddas.<\/h5>\n<pre class=\"lang:mysql decode:true\">\/* Retrieve queries that ran longer then 1 secs *\/\r\nSELECT <strong>CONSULTOR<\/strong>((SELECT <strong>RAW<\/strong> statement FROM  system:completed_requests\r\nWHERE trunc(str_to_duration(elapsedTime)\/1000000000) &gt; 1))<\/pre>\n<h3><strong>Identificar os \u00edndices ineficientes existentes<\/strong><\/h3>\n<h5>Mesmo quando voc\u00ea j\u00e1 tem \u00edndices para sua consulta, a execu\u00e7\u00e3o do Index Advisor pode ajudar a identificar casos em que os \u00edndices existentes podem n\u00e3o ser os melhores \u00edndices, com base na orienta\u00e7\u00e3o do Couchbase Index.<\/h5>\n<p>Considere este exemplo:<\/p>\n<pre class=\"lang:mysql decode:true\">SELECT COUNT(1) FROM `travel-sample` t WHERE t.type = \u201cairport\u201d AND t.icao IS NOT NULL AND t.geo.alt &lt; 300;<\/pre>\n<p>E que sua consulta pode ser executada sem nenhum problema com um \u00edndice abaixo:<\/p>\n<pre class=\"lang:default decode:true\">CREATE INDEX ix1 ON `travel-sample`(`type`,`icao`,`geo`.`alt`)\r\n<\/pre>\n<p>Mas o \u00edndice recomendado para a consulta seria:<\/p>\n<pre class=\"lang:default decode:true\">CREATE INDEX adv_geo_alt_icao_type ON `travel-sample`(`geo`.`alt`,`icao`) WHERE `type` = \u2018airport\u2019<\/pre>\n<p>Isso ocorre porque o \u00edndice deve ter um desempenho melhor se as chaves seguirem a ordem da regra do tipo de predicado:<\/p>\n<ul>\n<li>Regra 4. Menor que\/entre\/maior que.<\/li>\n<li>Regra 6. N\u00e3o nulo\/n\u00e3o ausente\/valorizado.<\/li>\n<li>Regra 8. Sabor para \u00edndice parcial.<\/li>\n<\/ul>\n<h3><b>Conven\u00e7\u00e3o de nomenclatura de \u00edndice recomendada<\/b><\/h3>\n<p>O Index Advisor recomenda um \u00edndice com uma conven\u00e7\u00e3o de nomenclatura espec\u00edfica,<\/p>\n<ul>\n<li>adv_field1_field2_field3...<\/li>\n<\/ul>\n<p>Para \u00edndices de matriz, um sublinhado extra \u00e9 adicionado ao final do \u00edndice da matriz para fazer a distin\u00e7\u00e3o:<\/p>\n<ul>\n<li>adv_[DISTINCT\/ALL]_campo1_campo1.2_campo1.2.3__campo2_campo3...<\/li>\n<\/ul>\n<p>Recomenda-se que voc\u00ea mantenha a nomenclatura do \u00edndice conforme fornecida, pois isso permitir\u00e1 que o Index Advisor reconhe\u00e7a os \u00edndices que ele recomendou anteriormente em compara\u00e7\u00e3o com os que foram criados por outros meios. Em atualiza\u00e7\u00f5es futuras, o Index Advisor pode optar por recomendar a substitui\u00e7\u00e3o de um \u00edndice, mas s\u00f3 o far\u00e1 se o \u00edndice que ele procura substituir for um que tenha sido recomendado anteriormente.<\/p>\n<h3><strong>Usar estat\u00edsticas de \u00edndice Tempo da \u00faltima varredura conhecida<\/strong><\/h3>\n<p>Seu banco de dados pode ter muitos \u00edndices para diferentes requisitos de consulta durante um per\u00edodo de tempo. Mas, \u00e0 medida que os \u00edndices s\u00e3o acumulados em seu banco de dados, h\u00e1 a possibilidade de haver duplicatas ou \u00edndices criados de forma semelhante. Isso inclui \u00edndices que n\u00e3o est\u00e3o mais em uso. Voc\u00ea pode consultar o valor \"<em><strong>last_known_scan_time<\/strong><\/em>\" do ponto de extremidade de repouso Index stats, para determinar os status dos seus \u00edndices e, em seguida, decidir se voc\u00ea deve eliminar o \u00edndice.<\/p>\n<pre class=\"lang:mysql decode:true\">SELECT ARRAY {\"index_name\":a.name,\"last_scan_time\":millis_to_str(a.val.last_known_scan_time\/1000000)} \r\n          FOR a IN OBJECT_PAIRS(results) END\r\nFROM curl(\"https:\/\/&lt;index_host&gt;:9102\/api\/v1\/stats\",\r\n     {\"user\":\"Administrator:password\"}) results<\/pre>\n<p>Resultados:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6766\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-24-at-1.43.28-PM.png\" alt=\"\" width=\"633\" height=\"450\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.43.28-PM.png 633w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.43.28-PM-300x213.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-1.43.28-PM-20x14.png 20w\" sizes=\"auto, (max-width: 633px) 100vw, 633px\" \/><\/p>\n<h3><b>Resumo<\/b><\/h3>\n<p>Do ponto de vista da implementa\u00e7\u00e3o de aplicativos, a necessidade de gerenciar \u00edndices n\u00e3o termina no final do processo de desenvolvimento, mas \u00e9 um exerc\u00edcio cont\u00ednuo.  De fato, o gerenciamento de \u00edndices deve ter um ciclo de vida pr\u00f3prio. Isso se deve ao fato de que o volume e a forma dos dados podem mudar com o tempo, o que, consequentemente, pode exigir altera\u00e7\u00f5es nos \u00edndices existentes. Em alguns casos, a constru\u00e7\u00e3o da consulta tamb\u00e9m pode precisar ser revisada. O consultor de \u00edndices, portanto, \u00e9 uma parte essencial do gerenciamento do ciclo de vida do produto.<\/p>\n<p>Alguns pontos importantes a serem observados sobre o Index Advisor a partir do Couchbase 6.5 (DP)<\/p>\n<ul>\n<li>Tipo de \u00edndice - O Index Advisor recomenda apenas \u00edndices GSI. Ele n\u00e3o recomenda o \u00edndice prim\u00e1rio nem o \u00edndice FTS.<\/li>\n<li>Baseado em regras - Na implementa\u00e7\u00e3o atual, o Index Advisor recomenda \u00edndices baseados em predicados, lista de proje\u00e7\u00e3o e ordem da coluna principal. Na verdade, ele se baseia na mesma regra usada pelo planejador de consultas. Assim como na otimiza\u00e7\u00e3o de banco de dados baseada em regras (RBO), o Index Advisor n\u00e3o leva em conta as estat\u00edsticas da distribui\u00e7\u00e3o de dados das colunas-chave. Por esse motivo, o usu\u00e1rio deve realizar uma avalia\u00e7\u00e3o de desempenho com os \u00edndices recomendados antes de implant\u00e1-los em um ambiente de produ\u00e7\u00e3o.<\/li>\n<li>Subconsulta - O Index Advisor funciona com subconsulta quando a consulta est\u00e1 apenas na cl\u00e1usula FROM.<\/li>\n<li>\u00cdndice de matriz com v\u00e1rias chaves - O Index Advisor recomendar\u00e1 apenas uma \u00fanica chave para um \u00edndice de matriz, mesmo quando o predicado fizer refer\u00eancia a v\u00e1rios campos de matriz.<\/li>\n<li>\u00cdndice de parti\u00e7\u00e3o - O Index Advisor n\u00e3o inclui a cl\u00e1usula de particionamento no \u00edndice de parti\u00e7\u00e3o recomendado. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/createindex.html\">cria\u00e7\u00e3o de \u00edndices<\/a> declara\u00e7\u00f5es.<\/li>\n<li>\u00cdndices existentes - O Index Advisor n\u00e3o recomenda o redesenho de \u00edndices existentes, nem recomenda a elimina\u00e7\u00e3o de \u00edndices existentes. O usu\u00e1rio deve usar o tempo da \u00faltima varredura do \u00edndice para tomar a decis\u00e3o.<\/li>\n<\/ul>\n<h3><b>Recursos<\/b><\/h3>\n<ul>\n<li><i>Baixar<\/i>:\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer\">Fa\u00e7a o download do Couchbase Server 6.5<\/a><i><\/i><\/li>\n<li><i>Documenta\u00e7\u00e3o<\/i>:\u00a0<a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html\">Couchbase Server 6.5 O que h\u00e1 de novo<\/a><i><\/i><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/6-5\/\"><b>Todos os blogs 6.5<\/b><\/a><\/li>\n<\/ul>\n<p>Gostar\u00edamos muito de saber se voc\u00ea gostou dos recursos da vers\u00e3o 6.5 e como ela beneficiar\u00e1 sua empresa no futuro. Compartilhe seu feedback por meio dos coment\u00e1rios ou na se\u00e7\u00e3o\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">f\u00f3rum<\/a>.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>As application developers, your main focus is to design the most efficient queries\u00a0 for your application. You want to ensure the integrity of the data that your application pushes to the database, and construct the most efficient queries to retrieve [&hellip;]<\/p>","protected":false},"author":26326,"featured_media":10766,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,9417,1812],"tags":[],"ppma_author":[8919],"class_list":["post-6764","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-performance","category-n1ql-query"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v26.3) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>N1QL Index Advisor: Improve Query Performance, Productivity<\/title>\n<meta name=\"description\" content=\"Couchbase N1QL Index Advisor, a new feature in Couchbase 6.5, provides recommendations for Global Secondary Indexes for N1QL query statements.\" \/>\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\/pt\/n1ql-index-advisor-improve-query-performance-and-productivity\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"N1QL Index Advisor: Improve Query Performance, Productivity\" \/>\n<meta property=\"og:description\" content=\"Couchbase N1QL Index Advisor, a new feature in Couchbase 6.5, provides recommendations for Global Secondary Indexes for N1QL query statements.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-index-advisor-improve-query-performance-and-productivity\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-09T15:47:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:19:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1400\" \/>\n\t<meta property=\"og:image:height\" content=\"636\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Binh Le\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Binh Le\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/\"},\"author\":{\"name\":\"Binh Le\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\"},\"headline\":\"N1QL Index Advisor: Improve Query Performance, Productivity\",\"datePublished\":\"2019-05-09T15:47:43+00:00\",\"dateModified\":\"2025-06-14T03:19:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/\"},\"wordCount\":2508,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png\",\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"High Performance\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/\",\"name\":\"N1QL Index Advisor: Improve Query Performance, Productivity\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png\",\"datePublished\":\"2019-05-09T15:47:43+00:00\",\"dateModified\":\"2025-06-14T03:19:36+00:00\",\"description\":\"Couchbase N1QL Index Advisor, a new feature in Couchbase 6.5, provides recommendations for Global Secondary Indexes for N1QL query statements.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png\",\"width\":1400,\"height\":636,\"caption\":\"A series icons representing performance statistics on a dashboard\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"N1QL Index Advisor: Improve Query Performance, Productivity\"}]},{\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/f89064928e262c71eb43bee996c48c63\",\"name\":\"Binh Le\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"caption\":\"Binh Le\"},\"description\":\"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/binh-le-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"N1QL Index Advisor: Melhore o desempenho e a produtividade das consultas","description":"O Couchbase N1QL Index Advisor, um novo recurso do Couchbase 6.5, fornece recomenda\u00e7\u00f5es para \u00edndices secund\u00e1rios globais para instru\u00e7\u00f5es de consulta N1QL.","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\/pt\/n1ql-index-advisor-improve-query-performance-and-productivity\/","og_locale":"pt_BR","og_type":"article","og_title":"N1QL Index Advisor: Improve Query Performance, Productivity","og_description":"Couchbase N1QL Index Advisor, a new feature in Couchbase 6.5, provides recommendations for Global Secondary Indexes for N1QL query statements.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-index-advisor-improve-query-performance-and-productivity\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-05-09T15:47:43+00:00","article_modified_time":"2025-06-14T03:19:36+00:00","og_image":[{"width":1400,"height":636,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png","type":"image\/png"}],"author":"Binh Le","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Binh Le","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/"},"author":{"name":"Binh Le","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63"},"headline":"N1QL Index Advisor: Improve Query Performance, Productivity","datePublished":"2019-05-09T15:47:43+00:00","dateModified":"2025-06-14T03:19:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/"},"wordCount":2508,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png","articleSection":["Application Design","Best Practices and Tutorials","High Performance","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/","url":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/","name":"N1QL Index Advisor: Melhore o desempenho e a produtividade das consultas","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png","datePublished":"2019-05-09T15:47:43+00:00","dateModified":"2025-06-14T03:19:36+00:00","description":"O Couchbase N1QL Index Advisor, um novo recurso do Couchbase 6.5, fornece recomenda\u00e7\u00f5es para \u00edndices secund\u00e1rios globais para instru\u00e7\u00f5es de consulta N1QL.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/05\/Screen-Shot-2019-04-25-at-11.13.01-AM_RESIZED.png","width":1400,"height":636,"caption":"A series icons representing performance statistics on a dashboard"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-index-advisor-improve-query-performance-and-productivity\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"N1QL Index Advisor: Improve Query Performance, Productivity"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/f89064928e262c71eb43bee996c48c63","name":"Binh Le","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7","url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","caption":"Binh Le"},"description":"Binh Le \u00e9 gerente de produto principal do servi\u00e7o Couchbase Query. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Cloud Analytics e CRM OnDemand. Binh \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela Universidade de Brighton, no Reino Unido.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/binh-le-2\/"}]}},"authors":[{"term_id":8919,"user_id":26326,"is_guest":0,"slug":"binh-le-2","display_name":"Binh Le","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","author_category":"","last_name":"Le","first_name":"Binh","job_title":"","user_url":"","description":"Binh Le \u00e9 gerente de produto principal do servi\u00e7o de consulta do Couchbase. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Clould Analytics e CRM OnDemand. Binh \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela Universidade de Brighton, no Reino Unido."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/26326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=6764"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6764\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10766"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=6764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=6764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=6764"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=6764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}