Indexação secundária no Azure Cosmos DB for Apache Cassandra

APLICA-SE A: Cassandra

A API para Cassandra no Azure Cosmos DB aproveita a infraestrutura de indexação subjacente para expor a força de indexação que é inerente à plataforma. No entanto, diferente da API para NoSQL principal, a API para Cassandra no Azure Cosmos DB não indexa todos os atributos por padrão. Em vez disso, ele dá suporte à indexação secundária para criar um índice em determinados atributos, que se comportam da mesma forma que o Apache Cassandra.

Em geral, não é recomendável executar consultas de filtro nas colunas que não estão particionadas. Você deve usar a sintaxe permitir filtragem explicitamente, o que resulta em uma operação que pode não ter um bom desempenho. No Azure Cosmos DB você pode executar essas consultas em atributos de baixa cardinalidade porque elas se descobrem entre partições para recuperar os resultados.

Não é recomendável criar um índice em uma coluna atualizada com frequência. É prudente criar um índice quando você define a tabela. Isso garante que os dados e índices estejam em um estado consistente. Caso você crie um novo índice nos dados existentes, no momento, não é possível rastrear a alteração de progresso do índice para a tabela. Se você precisar acompanhar o progresso dessa operação, precisará solicitar a alteração do progresso por meio de um tíquete de suporte.

Observação

Os índices secundários só podem ser criados usando os comandos CQL mencionados neste artigo e não por meio dos utilitários do provedor de recursos (modelos do ARM, CLI do Azure, PowerShell ou Terraform). Não há suporte para índices secundários nos seguintes objetos:

  • tipos de dados como tipos de coleção congelado, decimal e tipos variantes.
  • Colunas estáticas
  • Chaves de clustering

Aviso

As chaves de partição não são indexadas por padrão na API para Cassandra. Se você tiver uma chave primária composta na tabela e filtrar a chave de partição ou a chave de clustering, ou apenas a chave de partição, isso fornecerá o comportamento desejado. No entanto, se você filtrar a chave de partição e todos os outros campos não indexados além da chave de clustering, isso resultará em uma saída de chave de partição, mesmo que os outros campos não indexados tenham um índice secundário. Se você tiver uma chave primária composta na tabela e quiser filtrar o elemento de valor da chave de partição da chave primária composta e outro campo que não seja a chave de partição nem a chave de clustering, lembre-se de adicionar explicitamente um índice secundário na chave de partição. O índice nesse cenário deve aprimorar o desempenho da consulta de maneira significativa, mesmo que os outros campos de chave que não são de partição nem de clustering não tenham nenhum índice. Confira nosso artigo sobre particionamento para obter mais informações.

Exemplo de indexação

Primeiro, crie uma tabela e um keyspace de exemplo executando os seguintes comandos no prompt do Shell CQL:

CREATE KEYSPACE sampleks WITH REPLICATION = {'class' : 'SimpleStrategy'};
CREATE TABLE sampleks.t1(user_id int PRIMARY KEY, lastname text) WITH cosmosdb_provisioned_throughput=400;

Em seguida, insira dados de usuário de exemplo com os seguintes comandos:

insert into sampleks.t1(user_id,lastname) values (1, 'nishu');
insert into sampleks.t1(user_id,lastname) values (2, 'vinod');
insert into sampleks.t1(user_id,lastname) values (3, 'bat');
insert into sampleks.t1(user_id,lastname) values (5, 'vivek');
insert into sampleks.t1(user_id,lastname) values (6, 'siddhesh');
insert into sampleks.t1(user_id,lastname) values (7, 'akash');
insert into sampleks.t1(user_id,lastname) values (8, 'Theo');
insert into sampleks.t1(user_id,lastname) values (9, 'jagan');

Se você tentar executar a instrução a seguir, encontrará um erro que solicita que você use ALLOW FILTERING:

select user_id, lastname from sampleks.t1 where lastname='nishu';

Embora a API para Cassandra dê suporte à filtragem de permitir, conforme mencionado na seção anterior, não é recomendável. Em vez disso, você deve criar um índice conforme mostrado no exemplo a seguir:

CREATE INDEX ON sampleks.t1 (lastname);

Depois de criar um índice no campo "lastname", agora você pode executar a consulta anterior com êxito. Com a API para Cassandra no Azure Cosmos DB, você não precisa fornecer um nome de índice. Um índice padrão com formato tablename_columnname_idx é usado. Por exemplo, t1_lastname_idx é o nome do índice para a tabela anterior.

Descartando o índice

Você precisa saber qual é o nome do índice para descartar o índice. Execute o comando desc schema para obter a descrição da tabela. A saída desse comando inclui o nome do índice no formato CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname) . Em seguida, você pode usar o nome do índice para descartar o índice, conforme mostrado no exemplo a seguir:

drop index sampleks.t1_lastname_idx;

Próximas etapas