Como desenvolvedores de aplicativos, seu foco principal é projetar as consultas mais eficientes para o seu aplicativo. Você 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ários para o aplicativo. Em muitos casos, o desempenho do aplicativo é adiado para um estágio posterior do ciclo de desenvolvimento. Muitas vezes, isso é deixado para os especialistas em desempenho de banco de dados, que podem fornecer as recomendações para o design do índice, que também 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ção de melhor desempenho no início do ciclo de desenvolvimento.
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.
O Couchbase N1QL Index Advisor, um novo recurso do Couchbase 6.5 (DP), agora fornece recomendações de índices GSI para instruções de consulta N1QL. Seu principal objetivo é recomendar o índice para otimizar o tempo de resposta da consulta. Isso permite que os desenvolvedores se tornem mais produtivos, pois podem criar o(s) índice(s) recomendado(s) e ver o desempenho da consulta no início do ciclo de desenvolvimento. Também permite que os DBAs melhorem o desempenho do sistema revisando periodicamente as consultas de execução lenta.
Você pode aprender a usar o Couchbase Index Advisor lendo o Entendendo o Index Advisor e Comece a usar o Index Advisor seções abaixo. As seções restantes fornecem mais detalhes sobre como o Index Advisor chega às recomendações, incluindo dicas sobre como usar o Index Advisor em solicitações concluídas e como identificar índices usados com pouca frequência.
Entendendo o Index Advisor
Desempenho do banco de dadosEmbora seja uma tarefa difícil de gerenciar bem, é um problema bem compreendido pelos fornecedores de bancos de dados. O advento do SaaS e do DBasS também significa que o desafio do desempenho do banco de dados é apenas parte do serviço e precisa ser automatizado em relação à sua capacidade de diagnosticar e corrigir o problema. Nossa equipe de desenvolvimento tem trabalhado arduamente para criar os blocos de construção para essa visão.
O Couchbase Index Advisor faz parte da construção 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ê precisa entender as principais técnicas de recuperação de dados na plataforma de dados do Couchbase:
- Chave-valor - Um acesso rápido e direto aos dados para o serviço de dados quando as chaves estão disponíveis. Esse método de acesso não envolve o serviço de indexação do Couchbase.
- Serviço de indexação (GSI) - Um serviço dimensionável que permite que os aplicativos executem consultas N1QL rápidas. O GSI aproveita uma arquitetura distribuída e armazena os índices em um conjunto independente de nós no cluster do Couchbase.
- Pesquisa (FTS) - Um serviço de pesquisa de texto completo que oferece pesquisa por palavra-chave e pesquisa difusa. O FTS, como todos os serviços do Couchbase, é um serviço distribuído que pode ser configurado no cluster do Couchbase.
O N1QL Query aproveita todos os serviços acima para fornecer o resultado da consulta aos aplicativos. No entanto, o Index Advisor na versão 6.5 (DP) recomenda apenas os índices gerenciados pelo serviço Index (GSI). O Index Advisor não avalia a técnica de recuperação do serviço Data por meio de USE KEYS, nem o serviço Search (FTS) por meio da função N1QL SEARCH_QUERY() e SEARCH().
Comece a usar o Index Advisor
Como mencionei anteriormente, o Index Advisor é o primeiro de uma série de recursos que apresentamos para o ajuste de desempenho do banco de dados. O Index Advisor ajuda a identificar sistematicamente os índices que podem otimizar o desempenho do aplicativo e a garantir que os índices sejam criados usando a prática recomendada para a ordem das chaves. Na verdade, o Index Advisor pode oferecer recomendações mesmo quando você já tem índices em funcionamento para suas consultas.
Você pode começar a usar o N1QL Index Advisor usando:
N1QL - ADVISE [INDEX]
1 2 3 4 5 6 7 |
CONSELHO SELECIONAR rota.destinoaeroporto DE `viagem-amostra aeroporto JUNTAR `viagem-amostra rota ON aeroporto.faa = rota.origemaeroporto E rota.tipo = "route" (rota) ONDE aeroporto.tipo = "aeroporto" E aeroporto.cidade = "São Francisco" E aeroporto.país = "Estados Unidos"; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
[ { "#operator": "Aconselhar", "aconselhamento": { "#operator": "IndexAdvice", "adviseinfo": [ { "current_indexes": [ { "index_statement" (declaração de índice): "CREATE INDEX def_city ON `travel-sample`(`city`)" }, { "index_statement" (declaração de índice): "CREATE INDEX def_type ON `travel-sample`(`type`)" }, { "index_statement" (declaração de índice): "CREATE INDEX def_faa ON `travel-sample`(`faa`)" }, { "index_statement" (declaração de índice): "CREATE INDEX def_route_src_dst_day ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = 'route')", "index_status": "ESTE É UM ÍNDICE DE COBERTURA IDEAL". } ], "recommended_indexes" (índices recomendados): { "covering_indexes": [ { "index_statement" (declaração de índice): "CREATE INDEX adv_faa_country_city_type ON `travel-sample`(`faa`,`country`,`city`) WHERE `type` = 'airport'" } ], "indexes" (índices): [ { "index_statement" (declaração de índice): "CREATE INDEX adv_faa_country_city_type ON `travel-sample`(`faa`,`country`,`city`) WHERE `type` = 'airport'", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 1. igualdade, 8. sabor para índice parcial." } ] } } ] }, "query" (consulta): "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\";" } ] |
Índices atuais - A seção lista todos os índices existentes que o planejador de consultas usará para essa consulta. Ela também fornece informações adicionais sobre qualquer índice que o planejador de consultas use como índice de cobertura.
Índices recomendados - Esta seção lista todos os índices recomendados pelo Index Advisor. As recomendações de índice de cobertura são aquelas que permitiriam que a consulta funcionasse sem a busca adicional do serviço de dados. Já a seção de índices mostra apenas aqueles que ajudam com a cláusula de predicado. Observe que pode haver duplicação de informações nessas duas seções, mas onde o nome do índice seria idêntico e onde as chaves do índice são as mesmas.
Ele também fornece o motivo pelo qual recomendou os índices.
Usar o Advise no Query Workbench
Clique no botão Advise para obter a saída do Index Advisor para a consulta.
O N1QL ADVISE oferece suporte a consultas para SELECT, DELETE, UPDATE e MERGE. Ele fornece recomendações de índices para:
- Cláusula Predicate WHERE.
- Cláusula ON de condição de união para união de índices, união ANSI, Index NEST, ANSI NEST e ANSI MERGE.
- Índice de matriz para UNNEST e predicados de matriz na cláusula WHERE/ON.
- Sub-Query quando usado na cláusula FROM.
Como funciona o Index Advisor
Usarei a seguinte abordagem para explicar como o Index Advisor funciona.
- Selecionarei um exemplo que tem as construções de consulta típicas (predicado, união, matriz, grupo por), que podem ser difíceis de adivinhar quais são os melhores índices para a consulta.
- Examine o plano de consulta para entender o que o otimizador faria com a consulta atual.
- Determinar manualmente quais índices devem ser criados para melhorar o desempenho da consulta. Isso se basearia no entendimento de um desenvolvedor de aplicativos típico sobre índices de campo de predicado e união.
- Em seguida, execute o Couchbase Index Advisor e compare suas recomendações com as que tínhamos em mente.
- Crie os índices recomendados.
- Revise o novo plano de consulta e avalie as alterações.
A consulta de exemplo
Essa consulta recupera o número de rotas de companhias aéreas de qualquer aeroporto da cidade de San Jose, EUA, que têm voos programados para o domingo.
1 2 3 4 5 6 7 8 9 10 11 |
SELECIONAR companhia aérea.nome, aeroporto.nome do aeroporto, CONTAGEM(1) DE `viagens-amostra` aeroporto INNER JUNTAR `viagens-amostra` rota ON aeroporto.faa = rota.aeroporto de origem E rota.tipo = "route" (rota) INNER JUNTAR `viagens-amostra` companhia aérea ON rota.companhia aérea = companhia aérea.iata E companhia aérea.tipo = "companhia aérea" ONDE aeroporto.tipo = "aeroporto" E aeroporto.cidade = "San Jose" E aeroporto.país = "Estados Unidos" E QUALQUER x em rota.cronograma SATISFAÇÕES x.dia =0 FIM GRUPO BY companhia aérea.nome, aeroporto.nome do aeroporto |
O plano de consulta
- A consulta usou cinco índices
- Três índices foram usados para os predicados no tipo de documento "aeroporto": "cidade", "tipo" e "faa".
- Um índice foi usado para o tipo de documento "route" no campo "sourceairport" para fins de união entre "route" e "airport". Nesse caso, foi usado o índice existente "def_route_src_dst_day" porque ele tem a chave principal "sourceairport".
- Um índice para o tipo de documento 'airline', que é o índice parcial padrão para 'type'.
- Duas uniões NestedLoop de documentos - "aeroporto" - "rota" e "rota" - "companhia aérea". Mas, além do índice 'def_route_src_dst_day' em 'route', não há outros índices para suportar o restante das uniões. Portanto, essas uniões não são eficientes.
- Houve também uma agregação final para contar o número de rotas por companhia aérea.
- A consulta foi concluída em 2,1s
Como podemos melhorar o desempenho da consulta?
- O documento "airport" tem dois predicados ("city" e "country") e um predicado de sabor em "type". Além disso, a coluna "faa" do aeroporto também é usada para a união com "route". Portanto, em vez de usar três índices separados, deve haver um índice parcial no documento "airport" para ("city", "country") [action_1]. O campo "airport.faa" também poderia se beneficiar com um índice separado ou parte do índice principal do aeroporto.
- O documento 'route' não tem predicados, mas tem uma união com 'airport' com o campo 'sourceairport'. Um índice nessa coluna deve ajudar na união, e já temos o índice 'def_route_src_dst_day' [action_2], portanto, nenhuma ação é necessária para essa união.
- O documento "route" também tem uma junção com "airline" no campo "airline". Portanto, devemos ter um índice para isso - documento 'route' ('airline') [action_3].
- O documento "airline" também não tem nenhum predicado, mas tem uma junção com "route" com o campo "iata". Portanto, é necessário outro índice no documento "airline" ("iata") [action_4].
- Temos um predicado na matriz route.schedule. Portanto, também precisamos de um índice para isso. 'route' document (DISTINCT ARRAY x.day FOR x in schedule END) [action_5].
Portanto, chegamos a cinco pontos de ação, que resultam em quatro índices adicionais para essa consulta. Vamos ver o que o Index Advisor recomenda.
Execute o Index Advisor para verificar o resultado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
[ { "#operator": "Aconselhar", "aconselhamento": { "#operator": "IndexAdvice", "adviseinfo": [ { "current_indexes": [ { "index_statement" (declaração de índice): "CREATE INDEX def_city ON `travel-sample`(`city`)" }, { "index_statement" (declaração de índice): "CREATE INDEX def_type ON `travel-sample`(`type`)" }, { "index_statement" (declaração de índice): "CREATE INDEX def_faa ON `travel-sample`(`faa`)" }, { "index_statement" (declaração de índice): "CREATE INDEX def_route_src_dst_day ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = 'route')" }, { "index_statement" (declaração de índice): "CREATE INDEX def_type ON `travel-sample`(`type`)" } ], "recommended_indexes" (índices recomendados): { "covering_indexes": [ { "index_statement" (declaração de índice): "CREATE INDEX adv_faa_city_country_type_airportname ON `travel-sample`(`faa`,`city`,`country`,`airportname`) WHERE `type` = 'airport'" }, { "index_statement" (declaração de índice): "CREATE INDEX adv_iata_type_name ON `travel-sample`(`iata`,`name`) WHERE `type` = 'airline'" } ], "indexes" (índices): [ { "index_statement" (declaração de índice): "CREATE INDEX adv_country_faa_city_type ON `travel-sample`(`country`,`faa`,`city`) WHERE `type` = 'airport'", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 1. igualdade, 8. sabor para índice parcial." }, { "index_statement" (declaração de índice): "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'", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 1. igualdade, 5. predicado de matriz, 8. sabor para índice parcial." }, { "index_statement" (declaração de índice): "CREATE INDEX adv_iata_type ON `travel-sample`(`iata`) WHERE `type` = 'airline'", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 1. igualdade, 8. sabor para índice parcial." } ] } } ] }, "query" (consulta): "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" } ] |
Seção Índices atuais
Isso é o mesmo que o plano nos forneceu. A consulta usa cinco índices.
Seção de índices recomendados - "Índices"
Esta seção lista todos os índices da perspectiva do predicado. Observe que JOIN tem campos ON, que também são tratados como predicados. Então, vamos revisar os índices recomendados.
- adv_country_faa_city_type ON
amostra de viagem
(país
,faa
,cidade
) ONDEtipo
= 'airport' - Com exceção da ordem das chaves, esse é o mesmo índice que identificamos em [action_1]. A ordem das chaves não é significativa aqui, pois todos esses predicados usam igualdade. - adv_airline_sourceairport_DISTINCT_schedule_day_type ON
amostra de viagem
(companhia aérea
,aeroporto de origem
DISTINCT ARRAY x.day FOR x in schedule END) WHEREtipo
= 'route' - O que o Index Advisor fez aqui foi combinar [action_2, action_3, action_5] em um único índice. - adv_iata_type ON
amostra de viagem
(iata
) ONDEtipo
= 'airline' - Esse é o mesmo índice que identificamos em [action_4]
Seção de índices recomendados - "Cobrindo índices"
Esta seção lista todas as recomendações de índices de cobertura. Observe que Os índices de cobertura são aqueles usados para satisfazer uma consulta em um documento em que a execução não precisaria realizar uma busca adicional no serviço de dados.
- adv_faa_city_country_type_airportname_airportname ON
amostra de viagem
(país
,faa
,cidade
,nome do aeroporto
) ONDEtipo
= 'airport' - O Index Advisor adicionou o campo route.airportname ao índice recomendado [adv_country_faa_city_type ONamostra de viagem
(país
,faa
,cidade
)]. Ao fazer isso, o serviço de consulta não precisaria buscar o documento de rota no serviço de dados para projetar o route.airportname - adv_iata_type_name_name ON
amostra de viagem
(iata
,nome
) ONDEtipo
= 'airline' - O Index Advisor adicionou o airline.name ao índice recomendado [adv_iata_type ONamostra de viagem
(iata
) ONDEtipo
= 'airline']. Ao fazer isso, o serviço de consulta não precisaria buscar o documento da companhia aérea no serviço de dados para projetar o airline.name
Observação: O índice de cobertura reduz a necessidade de o serviço de consulta realizar buscas adicionais no serviço de dados, melhorando assim o desempenho da consulta. Mas o usuário precisa decidir se deve ou não criar índices de cobertura com base nas restrições específicas, como memória ou armazenamento do ambiente do usuário.
Criar todos os índices recomendados e revisar o novo plano de consulta
Para este exercício, decidi criar todos os índices recomendados usando índices de cobertura quando aplicável.
1 2 3 4 5 |
CRIAR ÍNDICE `adv_faa_city_type_country_airportname` ON `viagens-amostra`(`faa`,`cidade`,`nome do aeroporto`) ONDE ((`tipo` = "aeroporto") e (`país` = "Estados Unidos")) CRIAR ÍNDICE `adv_sourceairport_airline_DISTINCT_schedule_day_type` ON `viagens-amostra`(`aeroporto de origem`,`companhia aérea`,(distinto (matriz (`x`.`dia`) para `x` em `cronograma` final))) ONDE (`tipo` = "route" (rota)) CRIAR ÍNDICE `adv_iata_type_name` ON `viagens-amostra`(`iata`,`nome`) ONDE (`tipo` = "companhia aérea") |
O plano de consulta depois de adicionar os índices recomendados
- A consulta agora usa os três novos índices recomendados pelo Index Advisor, em vez de cinco índices.
- Como criamos índices de cobertura, o serviço de consulta não precisa mais fazer nenhuma busca adicional no serviço de dados.
- A consulta agora foi concluída em 120 ms. Uma melhoria de 94%.
Use o Index Advisor para analisar a carga de trabalho
N1QL - ADVISOR( )
O Index Advisor também pode ser chamado com a função ADVISOR(). Ela permite que os usuários:
- Passe em várias consultas. SELECT ADVISOR("SELECT ...", "SELECT ..", "UPDATE...");
- Passe uma subconsulta que retorne os comandos N1QL reais. Como a consulta retorna uma estrutura de documento json, você precisará usar a palavra-chave RAW para garantir que somente os comandos N1QL reais sejam retornados.
Use ADVISOR() para identificar as consultas lentas, consultando as solicitações concluídas.
1 2 3 |
/* Recuperar as consultas que foram executadas por mais de 1 segundo */ SELECIONAR <forte>CONSULTOR</forte>((SELECIONAR <forte>RAW</forte> declaração DE system:completed_requests ONDE trunc(str_to_duration(elapsedTime)/1000000000) > 1)) |
Identificar os índices ineficientes existentes
Mesmo quando você já tem índices para sua consulta, a execução do Index Advisor pode ajudar a identificar casos em que os índices existentes podem não ser os melhores índices, com base na orientação do Couchbase Index.
Considere este exemplo:
1 |
SELECT COUNT(1) DE `viagem-amostra t ONDE t.tipo = "aeroporto" E t.icao IS NÃO NULO E t.geo.alt < 300; |
E que sua consulta pode ser executada sem nenhum problema com um índice abaixo:
1 |
CRIAR ÍNDICE ix1 ON `viagens-amostra`(`tipo`,`icao`,`geo`.`alt`) |
Mas o índice recomendado para a consulta seria:
1 |
CRIAR ÍNDICE adv_geo_alt_icao_type ON `viagens-amostra`(`geo`.`alt`,`icao`) ONDE `tipo` = 'aeroporto' |
Isso ocorre porque o índice deve ter um desempenho melhor se as chaves seguirem a ordem da regra do tipo de predicado:
- Regra 4. Menor que/entre/maior que.
- Regra 6. Não nulo/não ausente/valorizado.
- Regra 8. Sabor para índice parcial.
Convenção de nomenclatura de índice recomendada
O Index Advisor recomenda um índice com uma convenção de nomenclatura específica,
- adv_field1_field2_field3...
Para índices de matriz, um sublinhado extra é adicionado ao final do índice da matriz para fazer a distinção:
- adv_[DISTINCT/ALL]_campo1_campo1.2_campo1.2.3__campo2_campo3...
Recomenda-se que você mantenha a nomenclatura do índice conforme fornecida, pois isso permitirá que o Index Advisor reconheça os índices que ele recomendou anteriormente em comparação com os que foram criados por outros meios. Em atualizações futuras, o Index Advisor pode optar por recomendar a substituição de um índice, mas só o fará se o índice que ele procura substituir for um que tenha sido recomendado anteriormente.
Usar estatísticas de índice Tempo da última varredura conhecida
Seu banco de dados pode ter muitos índices para diferentes requisitos de consulta durante um período de tempo. Mas, à medida que os índices são acumulados em seu banco de dados, há a possibilidade de haver duplicatas ou índices criados de forma semelhante. Isso inclui índices que não estão mais em uso. Você pode consultar o valor "last_known_scan_time" do ponto de extremidade de repouso Index stats, para determinar os status dos seus índices e, em seguida, decidir se você deve eliminar o índice.
1 2 3 4 |
SELECIONAR ARRAY {"nome_do_índice":a.name,"last_scan_time":millis_to_str(a.val.last_known_scan_time/1000000)} PARA a IN OBJECT_PAIRS(resultados) FIM DE curl("http://:9102/api/v1/stats", {"usuário":"Administrador:senha"}) resultados |
Resultados:
Resumo
Do ponto de vista da implementação de aplicativos, a necessidade de gerenciar índices não termina no final do processo de desenvolvimento, mas é um exercício contínuo. De fato, o gerenciamento de índices deve ter um ciclo de vida próprio. 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ções nos índices existentes. Em alguns casos, a construção da consulta também pode precisar ser revisada. O consultor de índices, portanto, é uma parte essencial do gerenciamento do ciclo de vida do produto.
Alguns pontos importantes a serem observados sobre o Index Advisor a partir do Couchbase 6.5 (DP)
- Tipo de índice - O Index Advisor recomenda apenas índices GSI. Ele não recomenda o índice primário nem o índice FTS.
- Baseado em regras - Na implementação atual, o Index Advisor recomenda índices baseados em predicados, lista de projeção e ordem da coluna principal. Na verdade, ele se baseia na mesma regra usada pelo planejador de consultas. Assim como na otimização de banco de dados baseada em regras (RBO), o Index Advisor não leva em conta as estatísticas da distribuição de dados das colunas-chave. Por esse motivo, o usuário deve realizar uma avaliação de desempenho com os índices recomendados antes de implantá-los em um ambiente de produção.
- Subconsulta - O Index Advisor funciona com subconsulta quando a consulta está apenas na cláusula FROM.
- Índice de matriz com várias chaves - O Index Advisor recomendará apenas uma única chave para um índice de matriz, mesmo quando o predicado fizer referência a vários campos de matriz.
- Índice de partição - O Index Advisor não inclui a cláusula de particionamento no índice de partição recomendado. criação de índices declarações.
- Índices existentes - O Index Advisor não recomenda o redesenho de índices existentes, nem recomenda a eliminação de índices existentes. O usuário deve usar o tempo da última varredura do índice para tomar a decisão.
Recursos
- Baixar: Faça o download do Couchbase Server 6.5
- Documentação: Couchbase Server 6.5 O que há de novo
- Todos os blogs 6.5
Gostaríamos muito de saber se você gostou dos recursos da versão 6.5 e como ela beneficiará sua empresa no futuro. Compartilhe seu feedback por meio dos comentários ou na seção fórum.
[...] 2. Use o serviço de consultoria do couchbase para encontrar gargalos https://www.couchbase.com/n1ql-index-advisor-improve-query-performance-and-productivity/ […]