Como todos sabemos, a manutenção do código é cara - quanto mais complexo for o código, maior será o custo de sua manutenção. Portanto, desde o início dos tempos, os desenvolvedores de software têm se esforçado muito para atingir o objetivo de reutilização de código.

O Couchbase Mobile 3.0 introduziu o suporte para consultas SQL++. Como desenvolvedor, a primeira coisa que me veio à mente foi compartilhar as consultas usadas em projetos voltados para os aplicativos Couchbase Server e Couchbase Mobile. 

Essa é uma boa ideia? Vamos explorar essa questão usando dados de amostra e um aplicativo móvel de prova de conceito.

Dados de amostra

Todo o código deste artigo está disponível em GitHub. Veja o LEIAME para obter informações sobre como configurar os projetos em seu computador.

Os dados de amostra são provenientes do OpenStreetMap e está licenciado sob a licença Open Data Commons Licença de banco de dados aberto (ODbL) pela OpenStreetMap Foundation.

O conjunto de dados contém todas as lojas que vendem sorvete nos Estados Unidos. Um exemplo de documento JSON está listado abaixo:

Como você pode ver, esse é um conjunto de dados versátil para testes porque tem propriedades incorporadas nos documentos.

Exemplo de aplicativo móvel

O Exemplo de aplicativo móvel foi escrito em SwiftUI com Combinar e é um aplicativo para iOS/macOS que exibe todas as várias lojas que vendem sorvete nos Estados Unidos. O aplicativo inclui um banco de dados pré-criado com os mesmos documentos JSON já importados para ele por conveniência. Esse aplicativo móvel usa a versão mais recente do SDK do Couchbase Lite. Você pode abrir o projeto no XCode a partir do arquivo de projeto na pasta src para acompanhar o processo.

Uma comparação de consulta simples

Para iniciar nossos testes, podemos escrever uma consulta simples para o Couchbase Server, para mostrar todos os endereços de sorveterias e ordená-los pelo nome da loja:

Essa consulta tem um filtro que retorna apenas documentos em que o objeto da propriedade addrCity tem um valor e onde o documento tipo é igual a Recurso. Se você se pergunta por que temos o addrCity é devido a dados sujos ou documentos sem nomes ou informações ausentes nesse conjunto de dados. Usando um tipo O atributo é comum em aplicativos móveis para filtrar diferentes tipos de documentos.

Podemos usar o Editor de consultas do servidor Couchbase Console da Web para executar essa consulta. Quando a executei em meu Macbook Pro M1 Max pessoal, o resultado chegou em 38,4 ms. Essa consulta usa o adv_properties_addrCity_type que você pode ver clicando no ícone Consultor de índices botão.

Portando a consulta para o Couchbase Lite

Agora vamos ver essa mesma consulta em execução no nosso aplicativo móvel. Para visualizar o aplicativo móvel, você pode usar o XCode para abrir o arquivo IceCreamLocator.xcodeproj localizado no arquivo src pasta. Uma vez aberta no Xcode, localize a pasta IceCreamLocationRepository swift no arquivo Compartilhado\Data pasta. 

O inicial ativa o registro detalhado do banco de dados para inspecionar as informações da consulta. Usando o registro detalhado, você pode analisar o que está acontecendo no Couchbase Lite, incluindo o desempenho da consulta.

Vamos analisar a consulta simples do Couchbase Server e ver como ela funciona no Swift com a nova API de consulta SQL++. A função para a consulta simples é denominada getListByTypeCityOrderNamee o código é exibido abaixo:

Há algumas maneiras de fazer uma consulta SQL++ no Swift. Neste exemplo, usamos o banco de dados createQuery para criar a consulta. No Couchbase Lite, estou usando o caractere de sublinhado (_) como o nome do banco de dados antes da função DE declaração. Alterar o nome do banco de dados é uma das alterações esperadas para reutilizar instruções SQL++. Além disso, para escapar das aspas no comando ONDE tive que adicionar o caractere de escape de string do Swift (\) antes de cada aspa. 

Para testar essa consulta durante a execução, você pode abrir o arquivo IceCreamListViewModel encontrado no arquivo ViewModels pasta. Localize a pasta inicial e descomente a primeira linha de exemplo localizada na parte inferior da função que chama a função getListByTypeCityOrderName da função _repositório variável:

Agora você pode usar o Xcode para executar o aplicativo em um simulador do iOS ou em um aplicativo do macOS. Em seguida, abra o aplicativo Console de depuração no Xcode, clicando no ícone Mostrar depuração no canto inferior direito do editor do Xcode, conforme destacado abaixo.

O registro detalhado exibirá uma quantidade enorme de informações de registro. Para ajudar a encontrar as informações corretas nos logs, use a caixa de filtro abaixo do console. Por exemplo, digite o texto "Informações de consulta" e, em seguida, pressione a tecla Enter em seu teclado para ver informações sobre a consulta. O console de depuração filtrará os dados que o Couchbase Lite retorna.

A inspeção dos registros mostrará a Informações de consulta e o número de documentos encontrados pela consulta, quantos bytes e quanto tempo a consulta levou. Lembre-se de que os números que você está vendo são de um simulador, não de um dispositivo real. Para ajustar o desempenho de aplicativos móveis, você deve usar ferramentas da Apple com um dispositivo real.

A velocidade de execução dessa consulta é impressionante. Ainda mais impressionante é o fato de que ainda não foram criados índices, portanto, essa consulta é executada sem um índice e faz uma varredura de tabela, o que significa que ela precisa examinar o banco de dados em cada documento para ver se ele corresponde aos requisitos da consulta. O Couchbase Lite não exige índices e fará varreduras de tabela se necessário, enquanto o Couchbase Server exige índices porque as varreduras de tabela podem prejudicar o desempenho de todo o cluster. 

Em vários casos, a adição de índices pode melhorar significativamente o desempenho de suas consultas, portanto, vamos parar de executar o aplicativo, adicionar o índice adequado e verificar novamente o desempenho.

Abra o IceCreamLocationRepository e localize o createIceCreamIndexes função. Descomente o primeiro bloco de código para criar o primeiro índice de consulta:

Como testamos para ver se a consulta usou o índice que criamos? Na consulta getListByTypeCityOrderName você verá duas linhas que imprimem os resultados da função explain no console:

A consulta explicar executará o equivalente à função SQLite EXPLICAR O PLANO DE CONSULTA e armazene os resultados em uma cadeia de caracteres que você envia ao console usando a função print. Você pode filtrar por TABELA DE VARREDURA no console de depuração para encontrar os resultados. Ao analisar os resultados, certifique-se de remover o filtro anterior da janela do console. Agora, execute novamente o aplicativo e examine os registros para verificar a alteração de desempenho.

Você deverá ver o USANDO O ÍNDICE com o nome do índice criado, o que informa que a consulta usa o índice adequado. Observe que, embora os índices possam ajudar as consultas, eles também podem tornar mais lentas as inserções e atualizações de documentos. Você pode encontrar mais informações sobre indexação na seção Couchbase Lite documentação.

Outra comparação de consulta

Em nossa segunda comparação, filtramos os resultados para mostrar apenas as sorveterias no estado da Geórgia, ordenadas por cidade e estado:

Essa consulta retorna 15 documentos e usa uma consulta diferente, pois usamos o properties.addrState e properties.addrCity em nossos atributos ONDE cláusula. 

Observe que mudamos a forma como verificamos o properties.addrCity e usar o atributo IS NOT NULL agora. Isso mostra a flexibilidade da linguagem SQL++ e como os desenvolvedores podem usar diferentes sintaxes para produzir os mesmos resultados.

Agora, vamos voltar ao nosso aplicativo móvel para observar as diferenças. A função para nossa segunda consulta é denominada getListByStateGeorgiae o código é exibido abaixo:

Para testar essa nova consulta, você pode abrir o arquivo IceCreamListViewModel. Localize o inicial e comente a primeira linha de exemplo localizada na parte inferior da função que chama a função getListByTypeCityOrderName da função _repositório e descomente a linha que chama nossa nova função:

Você pode depurar o aplicativo usando o Xcode e verificar a área de depuração. Ela mostra os mesmos 15 documentos que foram retornados pela consulta executada no Couchbase Server, mas voltamos a fazer uma varredura de tabela, o que não é o comportamento que queremos - alteramos a consulta, mas ainda não criamos nenhum índice novo.

Para corrigir isso, podemos voltar ao IceCreamLocationRepository e localize o createIceCreamIndexes função. Descomente o segundo bloco de código para criar o segundo índice de consulta:

Descobrimos que poderíamos reutilizar o código nessas duas consultas mais simples, mas tivemos que adicionar os índices para evitar varreduras de tabela.

Capturas com reutilização de consultas

O Couchbase Server e o Couchbase Mobile não usam o mesmo mecanismo de armazenamento ou de consulta. Portanto, você pode se deparar com consultas do Couchbase Server que precisam de pequenas modificações para serem otimizadas para o Couchbase Mobile.

Para obter mais informações sobre o Couchbase Server, consulte a documentação sobre o Otimizador baseado em custos que o mecanismo de consulta usa. O portal do desenvolvedor do Couchbase também tem um bom artigo sobre como melhorar desempenho da consulta no Couchbase Server que podem explicar por que algumas consultas são escritas de uma maneira específica. 

Recomendo a leitura da documentação do Couchbase Mobile sobre solução de problemas consultas pois ele me ajudou a escrever consultas otimizadas e explica melhor a saída do plano de consulta do SQLite.

Resumo

Conforme mostrado em nossos exemplos de código com a versão 3.0 do Couchbase Mobile, é possível reutilizar o código SQL++ entre o Server e o Mobile. No entanto, talvez seja necessário modificar as consultas e os índices para obter o melhor desempenho. Por isso, recomendo fortemente a leitura da excelente documentação sobre SQL++ for Mobile - Diferenças em relação ao SQL++ for Server e Strings de consulta SQL++. Ele contém informações valiosas sobre as alterações que você pode precisar fazer em suas consultas para usá-las em seus aplicativos móveis.

Aqui estão alguns dos principais recursos mencionados ao longo da postagem:

 

Autor

Postado por Aaron LaBeau - Engenheiro de software principal

Aaron LaBeau é engenheiro de software principal da equipe de experiência do desenvolvedor e ecossistema. Ele tem mais de 29 anos de experiência em desenvolvimento substancial em Objective-C, Swift, Kotlin, Java, C#, Javascript e Typescript. Você pode encontrar seu perfil no GitHub em https://www.github.com/biozal/.

Deixar uma resposta