Criar um índice secundário global

É possível usar visualizações materializadas contínuas como índices secundários globais para tabelas.

Antes de ler esta página, familiarize-se com as visualizações materializadas contínuas.

Os dados em uma tabela do Bigtable geralmente são indexados por chaves de linha. No entanto, é possível criar uma visualização materializada contínua de uma tabela de origem e usá-la como um índice secundário global. Isso permite recuperar os mesmos dados usando diferentes padrões de pesquisa de consulta ao consultar a visualização materializada.

Um índice secundário global é uma visualização materializada contínua que contém um subconjunto de colunas de uma tabela de origem, além de uma chave de linha diferente da chave de linha na tabela de origem. Essas chaves de linha podem ser baseadas nas seguintes transformações, que permitem que seu aplicativo recupere os mesmos dados com base em diferentes padrões de pesquisa de consulta:

  • Atributos na tabela de origem, como qualificadores de coluna, valores de coluna ou partes da chave de linha de origem.
  • Uma reformatação da chave de linha.
  • Uma transformação que combina a chave de linha com um atributo.

O Bigtable sincroniza automaticamente os índices secundários globais com a tabela de origem de maneira eventualmente consistente.

Quando usar um índice secundário global

Muitas vezes, os aplicativos precisam consultar os mesmos dados usando diferentes padrões de pesquisa ou atributos. Por exemplo, considere um aplicativo que recupera informações do usuário pelo endereço de e-mail ou por um número de telefone. Talvez você queira o mesmo nível de performance nos dois padrões de consulta. Se você fizer do endereço de e-mail sua chave de linha do Bigtable e armazenar números de telefone em uma coluna, a performance da pesquisa de números de telefone será mais lenta porque exige uma verificação completa da tabela.

Para melhorar o desempenho da consulta ao pesquisar por um número de telefone, crie uma visualização materializada contínua com uma instrução SQL. A instrução SQL orienta o Bigtable sobre como reestruturar seus dados com uma chave de linha diferente. Uma visualização materializada contínua funciona como uma tabela que pode ser consultada. Em seguida, use a visualização como um índice secundário global. Ele oferece ao aplicativo outro caminho de acesso aos mesmos dados. Cada caminho usa uma chave de linha diferente para que você possa escolher um caminho alternativo para cada consulta. Para escolher o melhor caminho para sua consulta, entenda a estrutura da chave de linha de cada tabela e os dados que cada uma armazena.

Usar uma visualização materializada contínua como um índice secundário global pode melhorar o desempenho da consulta nos seguintes casos de uso:

  • Recriptografia dos dados: se você precisar consultar seus dados usando uma chave diferente das chaves de linha da tabela de origem, crie uma visualização materializada contínua com a chave alternativa e faça consultas nessa visualização.
  • Filtrar dados: se você quiser filtrar a tabela de origem e preencher apenas linhas específicas de dados no índice secundário global, forneça uma cláusula WHERE na consulta SQL que define a visualização.
  • Chaves de atributo: se você precisar consultar seus dados com base em um atributo que não seja chave, como um qualificador ou valor de coluna, inclua-o na cláusula ORDER BY.

Sobre os índices secundários globais

Para usar uma visualização materializada contínua no Bigtable como um índice secundário global, considere os seguintes requisitos:

  • A chave de linha de um novo índice secundário global precisa incluir a chave de linha da tabela de origem para ajudar a garantir um mapeamento individual entre as linhas da tabela de origem e as linhas no índice secundário global da visualização materializada contínua.
  • O índice secundário global não precisa ter o mesmo esquema ou atributos da tabela de origem. Na parte SELECT da consulta SQL, especifique quais colunas da tabela são necessárias e as transformações SQL dos dados que você quer aplicar.
  • O índice secundário global só precisa copiar os dados necessários para o padrão de consulta. Não é necessário fornecer todos os dados na tabela de origem.
  • No Bigtable, a chave de linha escolhida fornece a ordem de classificação padrão.

Para consultar índices secundários globais, considere os seguintes requisitos:

  • Todas as colunas na cláusula ORDER BY também precisam ser incluídas na cláusula SELECT.
  • Depois de definir o índice secundário global, seu aplicativo precisa conseguir escolher entre consultar a tabela de origem ou a visualização materializada que representa o índice secundário global.
  • Os aplicativos não gravam diretamente no índice, que é sincronizado continuamente com a tabela de origem. Sempre grave na tabela de origem.
  • O índice secundário global é eventualmente consistente. Os dados são gravados primeiro na tabela de origem e depois transformados no formato do índice secundário global.
  • Recomendamos que você crie um índice de cobertura. Para mais informações, consulte a seção Índices de cobertura deste documento.
  • A cláusula ORDER BY precisa conter a chave de linha não modificada da tabela de origem, e todos os dados precisam ser classificados em ordem crescente. A chave de linha na tabela de origem é sempre projetada para a visualização materializada, mas pode ser combinada com outros atributos.
  • As colunas na cláusula ORDER BY se tornam parte da chave de linha estruturada do índice secundário global. Todas as outras colunas selecionadas se tornam valores de coluna não chave no índice secundário global. Se você converter um valor na cláusula ORDER BY em um tipo de dados específico do GoogleSQL para Bigtable, ele vai manter o tipo de dados na chave de linha estruturada do índice secundário global.

Índices de cobertura

Um índice de cobertura inclui todas as colunas necessárias para suas consultas. Ao consultar um índice de cobertura, o Bigtable pode recuperar todos os dados necessários diretamente do índice, sem precisar acessar a tabela de origem. Recomendamos essa abordagem para um desempenho ideal porque ela minimiza o número de leituras de disco. Para criar um índice de cobertura, verifique se a instrução SELECT especifica todas as colunas necessárias nas consultas.

Quando quiser criar um índice não abrangente, consulte o índice e use os resultados para pesquisar as colunas adicionais necessárias na tabela de origem.

Definir um índice secundário global

Para criar um índice secundário global, crie uma visualização materializada contínua com uma consulta SQL que define o índice secundário global.

No exemplo a seguir, a consulta SQL cria um índice secundário global que permite consultar dados de interações do usuário. A cláusula ORDER BY define a chave de linha estruturada do índice secundário global usando uma combinação do número de telefone do usuário, ID do usuário e endereço de e-mail. Ele também atribui o nome interactions ao grupo de colunas activity:

SELECT
  user['phone'] AS phone,
  CAST(user['id'] AS INT64) AS user_id,
  _key AS email,
  activity AS interactions
FROM CLICKS_TABLE
ORDER BY 1, 2, 3;

A tabela a seguir explica como o índice é criado comparando a visualização da mesma linha na tabela de origem com o índice secundário global correspondente:

Linha da tabela de origem Linha de índice secundário global
Chave da linha:
_key: user1@example.com



Atributos:
user: {id: "123", phone: "555-123-4567"}
activity: {action: "CLICKED_PRODUCT_A"}
Chave de linha estruturada:
phone: 555-123-4567
user_id: 123
email: user1@example.com

Atributo:
interactions: {action: "CLICKED_PRODUCT_A"}
Chave da linha:
_key: user2@example.com



Atributos:
user: {id: "456", phone: "555-987-6543"}
activity: {action: "VIEWED_PRODUCT_B"}
Chave de linha estruturada:
phone: 555-987-6543
user_id: 456
email: user2@example.com

Atributo:
interactions: {action: "VIEWED_PRODUCT_B"}
Chave da linha:
_key: user3@example.com



Atributos:
user: {id: "1000", phone: "555-111-2222"}
activity: {action: "ADDED_TO_CART_PRODUCT_C"}
Chave de linha estruturada:
phone: 555-111-2222
user_id: 1000
email: user3@example.com

Atributo:
interactions: {action: "ADDED_TO_CART_PRODUCT_C"}

Limitações

  • Para ler a chave de saída, que é a chave de índice secundário global, só é possível usar consultas SQL.

A seguir