Temos o prazer de anunciar o lançamento do :
Serviço de consultoria de índice do Couchbase
http://index-advisor.couchbase.com
Mais um serviço? Por quê?
Lançamos o N1QL (SQL para JSON) há alguns anos, para que você pudesse usar o SQL para recuperar e manipular dados JSON. Mas, se não forem criados bons índices, as consultas não terão um bom desempenho! Como saber se o índice que você criou é bom o suficiente para o nosso mecanismo de consulta? Por isso, decidimos apresentar todas as regras que formam um bom índice. Mas isso envolveu muita leitura! Portanto, estamos dando um passo adiante para capacitá-lo. Agora estamos lançando um serviço -Consultor de índices-que aceita uma consulta e fornece uma recomendação de índice que atenderia às expectativas do nosso mecanismo de consulta - tudo isso sem fazer o download do servidor Couchbase mais recente.
Para quem?
Esse serviço fornecerá recomendações de índices para ajudar DBAs, desenvolvedores e arquitetos a otimizar o desempenho das consultas e atender aos SLAs.
O Index Advisor foi lançado como parte do Couchbase Server 6.5. Se você tiver feito o download dessa versão, terá tudo (e mais) do que esse serviço oferece.
Quando você deve usar esse serviço?
Se você:
- Deseja evitar a leitura do criação de índices regrasCompreendê-los e implementá-los para encontrar os índices apropriados para sua consulta/consultas/carga de trabalho.
- Ainda não deseja fazer o download do servidor Couchbase 6.5 mais recente.
- Está usando um versão mais antiga do Couchbase e precisa de ajuda para criar os índices certos para suas consultas.
- Deseja gerar conselhos para índices sem criar um bucket ou fazer upload do esquema ou dos dados.
Histórico:
N1QL é o SQL para dados e metadados JSON. Toda consulta escrita em N1QL tem um plano de consulta preparado pelo mecanismo de consulta N1QL. O desempenho e a eficiência de uma consulta dependem de seu plano. A criação de índices corretos para os dados ajuda na seleção dos índices que podem recuperar o conjunto de resultados da maneira mais eficiente. Embora o documento JSON em si não tenha um esquema, o índice precisa ter um esquema.
Por exemplo, índice ix1(field1,field2) é diferente do índice ix2(field2,field1).
Portanto, não apenas os campos que selecionamos para um índice são importantes, mas a ordem em que eles estão presentes em um índice também é importante para os índices GSI. (O índice FTS será abordado em outro blog).
Vida de uma consulta:
Dependendo da qualidade da etapa 4, podemos minimizar ou pular completamente as etapas 5 e 6 e, assim, melhorar o desempenho da consulta. Para ajudar com isso, estamos lançando o Index Advisor.
http://index-advisor.couchbase.com
Index Advisor - o serviço!
Com o Index Advisor, você pode
- Forneça uma consulta ou várias consultas de mesmo em um servidor mais antigo que o 6.5 e o serviço recomendará os índices que você deve ter/criar para obter o melhor desempenho.
- Como não temos seus dados ou esquema, não podemos ver se você tem esses índices no momento. Em breve, estaremos aprimorando essa interface para aceitar dados/estatísticas/esquema/inferência/índices atuais - ou qualquer outra coisa que você possa fornecer para que possamos fazer melhores recomendações.
Depois que você nos fornecer a consulta com a diretiva ADVISE, a ferramenta fornecerá as recomendações para o índice mínimo e o índice de cobertura.
- Índices: Esta seção lista os índices recomendados com base nos predicados da cláusula WHERE/ON, juntamente com a regra de recomendação correspondente que cada índice segue.
- Índices de cobertura: Esta seção lista os índices de cobertura aplicáveis à consulta de entrada, ou seja, um índice que inclui todos os campos referenciados na consulta para evitar o salto extra para o serviço de dados.
Esta é a aparência da ferramenta. Clique no gif abaixo para vê-lo claramente.
Exemplos:
1.
|
1 |
CONSELHO SELECIONAR fname, idade, idade/7 AS idade_dog_anos DE julgamento ONDE fname = Sara |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
{ "resultados": [ { "#operator": "Aconselhar", "aconselhamento": { "#operator": "IndexAdvice", "adviseinfo": [ { "recommended_indexes" (índices recomendados): { "covering_indexes": [ { "index_statement" (declaração de índice): "CREATE INDEX adv_fname_age ON `trial`(`fname`,`age`)", "keyspace_alias": "teste" } ], "indexes" (índices): [ { "index_statement" (declaração de índice): "CREATE INDEX adv_fname ON `trial`(`fname`)", "keyspace_alias": "teste", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 2. igualdade/nulo/ausência." } ] } } ] }, "query" (consulta): "SELECT fname, age, age/7 AS age_dog_years FROM trial WHERE fname = 'Sara'" } ] } |
2.
|
1 2 |
CONSELHO SELECIONAR (DISTINTO compras.customerId)DE compras ONDE compras.purchasedAt ENTRE "2014-03-01" E "2014-03-31" |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "resultados": [ { "#operator": "Aconselhar", "aconselhamento": { "#operator": "IndexAdvice", "adviseinfo": [ { "recommended_indexes" (índices recomendados): { "indexes" (índices): [ { "index_statement" (declaração de índice): "CREATE INDEX adv_purchasedAt ON `purchases`(`purchasedAt`)", "keyspace_alias": "compras", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 4. não menor que/entre/não maior que." } ] } } ] }, "query" (consulta): "SELECT (DISTINCT purchases.customerId) \nFROM purchases\nWHERE purchases.purchasedAt BETWEEN \"2014-03-01\" E \"2014-03-31\"" } ] } |
3.
|
1 2 3 4 |
CONSELHO SELECIONAR DISTINTO companhia aérea.nome,aeroporto.nome AS aeroporto,rota.distância 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" |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "resultados": [ { "#operator": "Aconselhar", "aconselhamento": { "#operator": "IndexAdvice", "adviseinfo": [ { "recommended_indexes" (índices recomendados): { "covering_indexes": [ { "index_statement" (declaração de índice): "CREATE INDEX adv_type_sourceairport_airline_distance ON `travel-sample`(`type`,`sourceairport`,`airline`,`distance`)", "keyspace_alias": "travel-sample_route" }, { "index_statement" (declaração de índice): "CREATE INDEX adv_type_iata_name ON `travel-sample`(`type`,`iata`,`name`)", "keyspace_alias": "companhia aérea de amostra de viagem" } ], "indexes" (índices): [ { "index_statement" (declaração de índice): "CREATE INDEX adv_type_sourceairport ON `travel-sample`(`type`,`sourceairport`)", "keyspace_alias": "travel-sample_route", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 2. igualdade/nulo/ausente, 10. predicado de união não estático." }, { "index_statement" (declaração de índice): "CREATE INDEX adv_type_iata ON `travel-sample`(`type`,`iata`)", "keyspace_alias": "companhia aérea de amostra de viagem", "recommending_rule" (regra de recomendação): "As chaves de índice seguem a ordem dos tipos de predicado: 2. igualdade/nulo/ausente, 10. predicado de união não estático." } ] } } ] }, "query" (consulta): "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\"\nINNER JOIN `travel-sample` airline ON route.airline = airline.iata AND airline.type = \"airline\"\nWHERE airport.type = \"airport\" AND airport.city = \"San Jose\";" } ] } |
4.
|
1 2 3 |
SELECIONAR CONSULTOR(["SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'", "SELECT * FROM `travel-sample` h JOIN `travel-sample` a ON a.city = h.city WHERE h.type = 'hotel' AND a.type = 'airport'"]) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "resultados": [ { "$1": { "recommended_indexes" (índices recomendados): [ { "índice": "CREATE INDEX adv_type_city ON `travel-sample`(`type`,`city`)", "declarações": [ { "run_count": 1, "declaração": "SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'" }, { "run_count": 1, "declaração": "SELECT * FROM `travel-sample` h JOIN `travel-sample` a ON a.city = h.city WHERE h.type = 'hotel' AND a.type = 'airport'" } ] } ] } } ] } |
Os índices candidatos são gerados de acordo com as regras de design especificadas aqui.
O que ainda precisa ser feito:
1. Aprimorar a interface do usuário dessa ferramenta. Fornecer recomendações de índice em texto para facilitar o recorte e a colagem. Atualmente, ela fornece uma saída JSON.
2. Aceitar sabores - para que possamos gerar recomendações de índices parciais.
3. Fornecer uma maneira de permitir que o usuário insira o esquema, os índices existentes, a saída inferida e talvez até mesmo os dados de teste.
Gostaríamos muito de saber o que você achou da ferramenta e quais recursos adicionais você gostaria de ver. Por favor, compartilhe seu feedback nos comentários.
Mais informações sobre o recurso Index Advisor:
https://www.couchbase.com/blog/n1ql-index-advisor-improve-query-performance-and-productivity/
https://www.couchbase.com/blog/index-advisor-for-query-workload/
https://docs.couchbase.com/server/6.5/n1ql/n1ql-language-reference/advise.html
https://docs.couchbase.com/server/6.5/n1ql/n1ql-language-reference/advisor.html
https://docs.couchbase.com/server/6.5/tools/query-workbench.html#index-advisor
Resumo:
O consultor de índice (instrução ADVISE) fornece recomendações de índice para uma única consulta. Ele aconselha o índice regular, o índice de matriz e o índice de cobertura e fornece informações sobre a regra de recomendação correspondente que cada chave de índice segue.
O consultor de índices (instrução ADVISOR) fornece recomendações de índices para várias consultas. Ele recomenda o menor número possível de índices que seriam adequados para todas as consultas na matriz.
Tente fazer isso em casa!
http://index-advisor.couchbase.com
