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

APLICA-SE A: Cassandra

A API para Cassandra no Azure Cosmos DB tira partido da infraestrutura de indexação subjacente para expor a força de indexação inerente à plataforma. No entanto, ao contrário da API principal para NoSQL, a API para Cassandra no Azure Cosmos DB não indexa todos os atributos por predefinição. Em vez disso, suporta a indexação secundária para criar um índice em determinados atributos, que se comporta da mesma forma que o Apache Cassandra.

Em geral, não é aconselhável executar consultas de filtro nas colunas que não estão particionadas. Tem de utilizar explicitamente a sintaxe PERMITIR FILTRAGEM, o que resulta numa operação que pode não ter um bom desempenho. No Azure Cosmos DB, pode executar essas consultas em atributos de baixa cardinalidade, uma vez que são apresentadas em partições para obter os resultados.

Não é aconselhável criar um índice numa coluna atualizada frequentemente. É prudente criar um índice quando define a tabela. Isto garante que os dados e os índices estão num estado consistente. Caso crie um novo índice nos dados existentes, atualmente, não pode controlar a alteração do progresso do índice para a tabela. Se precisar de controlar o progresso desta operação, tem de pedir a alteração do progresso através de um pedido de suporte.

Nota

Os índices secundários só podem ser criados com os comandos CQL mencionados neste artigo e não através dos utilitários do Fornecedor de Recursos (modelos arm, CLI do Azure, PowerShell ou Terraform). Os índices secundários não são suportados nos seguintes objetos:

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

Aviso

As chaves de partição não são indexadas por predefinição na API para Cassandra. Se tiver uma chave primária composta na tabela e filtrar a chave de partição e a chave de clustering ou apenas a chave de partição, isto dará o comportamento pretendido. No entanto, se filtrar a chave de partição e quaisquer outros campos não indexados para além da chave de clustering, isto resultará numa distribuição de chave de partição , mesmo que os outros campos não indexados tenham um índice secundário. Se 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, além de outro campo que não seja a chave de partição ou a chave de clustering, certifique-se de que adiciona explicitamente um índice secundário à chave de partição. O índice neste cenário deve melhorar significativamente o desempenho das consultas, mesmo que os outros campos de chave não particionadas e não de clustering não tenham índice. Veja o nosso artigo sobre criação de partições para obter mais informações.

Exemplo de indexação

Primeiro, crie um espaço de chaves e uma tabela de exemplo ao executar os seguintes comandos na linha de comandos da 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 utilizador 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 tentar executar a seguinte instrução, irá deparar-se com um erro que lhe pede para utilizar ALLOW FILTERING:

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

Embora a API para Cassandra suporte PERMITIR FILTRAGEM, conforme mencionado na secção anterior, não é recomendado. Em vez disso, deve criar um índice no, conforme mostrado no exemplo seguinte:

CREATE INDEX ON sampleks.t1 (lastname);

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

Remover o índice

Precisa de saber qual é o nome do índice para remover o índice. Execute o desc schema comando para obter a descrição da tabela. O resultado deste comando inclui o nome do índice no formato CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Em seguida, pode utilizar o nome do índice para remover o índice, conforme mostrado no exemplo seguinte:

drop index sampleks.t1_lastname_idx;

Passos seguintes