Temos o prazer de anunciar o lançamento do :
Serviço de consultoria de índice do Couchbase
https://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.
https://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 |
ADVISE SELECT fname, age, age/7 AS age_dog_years FROM trial WHERE 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 |
{ "results": [ { "#operator": "Advise", "advice": { "#operator": "IndexAdvice", "adviseinfo": [ { "recommended_indexes": { "covering_indexes": [ { "index_statement": "CREATE INDEX adv_fname_age ON `trial`(`fname`,`age`)", "keyspace_alias": "trial" } ], "indexes": [ { "index_statement": "CREATE INDEX adv_fname ON `trial`(`fname`)", "keyspace_alias": "trial", "recommending_rule": "Index keys follow order of predicate types: 2. equality/null/missing." } ] } } ] }, "query": "SELECT fname, age, age/7 AS age_dog_years FROM trial WHERE fname = 'Sara'" } ] } |
2.
|
1 2 |
ADVISE SELECT (DISTINCT purchases.customerId)FROM purchases WHERE purchases.purchasedAt BETWEEN "2014-03-01" AND "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 |
{ "results": [ { "#operator": "Advise", "advice": { "#operator": "IndexAdvice", "adviseinfo": [ { "recommended_indexes": { "indexes": [ { "index_statement": "CREATE INDEX adv_purchasedAt ON `purchases`(`purchasedAt`)", "keyspace_alias": "purchases", "recommending_rule": "Index keys follow order of predicate types: 4. not less than/between/not greater than." } ] } } ] }, "query": "SELECT (DISTINCT purchases.customerId) \nFROM purchases\nWHERE purchases.purchasedAt BETWEEN \"2014-03-01\" AND \"2014-03-31\"" } ] } |
3.
|
1 2 3 4 |
ADVISE 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" |
|
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 |
{ "results": [ { "#operator": "Advise", "advice": { "#operator": "IndexAdvice", "adviseinfo": [ { "recommended_indexes": { "covering_indexes": [ { "index_statement": "CREATE INDEX adv_type_sourceairport_airline_distance ON `travel-sample`(`type`,`sourceairport`,`airline`,`distance`)", "keyspace_alias": "travel-sample_route" }, { "index_statement": "CREATE INDEX adv_type_iata_name ON `travel-sample`(`type`,`iata`,`name`)", "keyspace_alias": "travel-sample_airline" } ], "indexes": [ { "index_statement": "CREATE INDEX adv_type_sourceairport ON `travel-sample`(`type`,`sourceairport`)", "keyspace_alias": "travel-sample_route", "recommending_rule": "Index keys follow order of predicate types: 2. equality/null/missing, 10. non-static join predicate." }, { "index_statement": "CREATE INDEX adv_type_iata ON `travel-sample`(`type`,`iata`)", "keyspace_alias": "travel-sample_airline", "recommending_rule": "Index keys follow order of predicate types: 2. equality/null/missing, 10. non-static join predicate." } ] } } ] }, "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\"\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 |
SELECT ADVISOR(["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 |
{ "results": [ { "$1": { "recommended_indexes": [ { "index": "CREATE INDEX adv_type_city ON `travel-sample`(`type`,`city`)", "statements": [ { "run_count": 1, "statement": "SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'" }, { "run_count": 1, "statement": "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!
https://index-advisor.couchbase.com
