O varbitx é uma extensão do PolarDB for PostgreSQL que adiciona funções avançadas de operação com cadeias de bits, além daquelas fornecidas pela extensão padrão varbit do PostgreSQL. Use esta extensão para manipulação de bits de alto desempenho em cenários como marcação de perfis de usuário em tempo real, controle de acesso publicitário e sistemas de bilhetagem.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster do PolarDB for PostgreSQL executando o PostgreSQL 11
Instale a extensão
CREATE EXTENSION varbitx;
Para remover a extensão:
DROP EXTENSION varbitx;
Funções
Todas as funções aceitam e retornam valores varbit padrão do PostgreSQL. As posições dos bits usam indexação baseada em zero (o bit mais à esquerda corresponde à posição 0).
Extração de bits
|
Função |
Descrição |
Exemplo |
|
|
Retorna |
|
|
|
Obtém |
|
|
|
Considerando os bits nas |
|
Modificação de bits
|
Função |
Descrição |
Exemplo |
|
|
Defina os bits nas |
|
|
|
Igual à anterior, mas interrompe o processamento após atingir |
|
|
|
Defina os bits nas |
|
|
|
Semelhante à função acima, mas para após alterar |
|
Geração de bits
|
Função |
Descrição |
Exemplo |
|
|
Retorna uma cadeia de bits com |
|
|
|
Gera uma cadeia de |
|
Contagem de bits
|
Função |
Descrição |
Exemplo |
|
|
Conta todos os bits iguais a |
|
|
|
Conta bits iguais a |
|
|
|
Conta quantos bits nas |
|
Consulta de posições
|
Função |
Descrição |
Exemplo |
|
|
Lista as posições de todos os bits iguais a |
|
|
|
Retorna até |
|
Exemplos de uso
Os exemplos abaixo demonstram um fluxo de trabalho típico para um sistema de marcação de usuários: crie uma tabela com uma coluna varbit, insira dados e consulte-os usando as funções do varbitx.
Crie uma tabela com coluna varbit
CREATE TABLE user_tags (
user_id integer,
tag_bits varbit
);
Inserir dados varbit
INSERT INTO user_tags VALUES (1, '1111000011110000');
INSERT INTO user_tags VALUES (2, '1011000011111110');
INSERT INTO user_tags VALUES (3, '0000111100001111');
Contar tags ativas por usuário
Conte os bits definidos como 1 (tags ativas) para cada usuário:
SELECT user_id, bit_count(tag_bits, 1) AS active_tag_count
FROM user_tags;
Saída esperada:
user_id | active_tag_count
---------+------------------
1 | 8
2 | 10
3 | 8
(3 rows)
Filtrar usuários pela posição da tag
Encontre os usuários que têm a tag na posição 0 definida:
SELECT user_id
FROM user_tags
WHERE get_bit(tag_bits, 0, 1) = B'1';
Ative tags específicas e registrar alterações
Use set_bit_array_record para ativar tags em posições específicas e obter as posições alteradas:
SELECT user_id,
set_bit_array_record(tag_bits, 1, 0, array[1,4,5,6,7], 2)
FROM user_tags
WHERE user_id = 1;
Saída esperada:
user_id | set_bit_array_record
---------+----------------------
1 | (1111110011110000,"{4,5}")
(1 row)