Este tópico descreve como usar a extensão roaringbitmap do ApsaraDB RDS for PostgreSQL para melhorar o desempenho de consultas.
Pré-requisitos
A instância RDS deve executar o PostgreSQL 12 ou superior.
Se a instância RDS executar o PostgreSQL 17, a versão secundária do mecanismo deve ser 20241030 ou posterior.
Informações básicas
Em um roaring bitmap, inteiros de 32 bits são divididos em 216 blocos. Os inteiros de cada bloco compartilham os mesmos 16 bits mais significativos. Os 16 bits menos significativos ficam armazenados em um contêiner. O roaring bitmap armazena contêineres em um array dinâmico como índices primários. Há dois tipos de contêineres: contêineres de array para blocos esparsos e contêineres de bitmap para blocos densos. Um contêiner de array armazena até 4.096 inteiros. Um contêiner de bitmap armazena mais de 4.096 inteiros.
Essa estrutura de armazenamento permite que os roaring bitmaps recuperem valores específicos rapidamente. Além disso, eles oferecem operações bitwise, como AND, OR e XOR, entre os dois tipos de contêineres. Por isso, os roaring bitmaps proporcionam excelente desempenho de armazenamento e computação.
Observações de uso
Para garantir a estabilidade da extensão, atualize a instância RDS para a versão secundária mais recente do mecanismo.
Para obter mais informações sobre como atualizar a versão secundária do mecanismo de uma instância RDS, consulte Upgrade the minor engine version.
Procedimento
-
Crie a extensão. Exemplo:
CREATE EXTENSION roaringbitmap; -
Crie uma tabela para armazenar dados do tipo roaringbitmap. Exemplo:
CREATE TABLE t1 (id integer, bitmap roaringbitmap); -
Use a função rb_build para inserir dados do tipo roaringbitmap. Exemplo:
-- Set the bit value of an array to 1. INSERT INTO t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- Set the bit values of multiple elements to 1 and aggregate the bit values into a roaring bitmap. INSERT INTO t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e; -
Execute operações de bitmap, como OR, AND, XOR e ANDNOT. Exemplo:
SELECT RB_OR(a.bitmap,b.bitmap) FROM (SELECT bitmap FROM t1 WHERE id = 1) AS a,(SELECT bitmap FROM t1 WHERE id = 2) AS b; -
Execute operações agregadas de bitmap, como OR, AND, XOR e BUILD, para gerar um novo roaring bitmap. Exemplo:
SELECT RB_OR_AGG(bitmap) FROM t1; SELECT RB_AND_AGG(bitmap) FROM t1; SELECT RB_XOR_AGG(bitmap) FROM t1; SELECT RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e; -
Calcule a cardinalidade do roaring bitmap. A cardinalidade corresponde ao número de bits definidos como 1 no roaring bitmap. Exemplo:
SELECT RB_CARDINALITY(bitmap) FROM t1; -
Obtenha os subscritos dos bits definidos como 1. Exemplo:
SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;
Funções de cálculo de bitmap
Função | Entrada | Saída | Descrição | Exemplo |
rb_build | integer[] | roaringbitmap | Cria um roaring bitmap a partir de um array de inteiros. | |
rb_and | roaringbitmap,roaringbitmap | roaringbitmap | Executa uma operação AND. | |
rb_or | roaringbitmap,roaringbitmap | roaringbitmap | Executa uma operação OR. | |
rb_xor | roaringbitmap,roaringbitmap | roaringbitmap | Executa uma operação XOR. | |
rb_andnot | roaringbitmap,roaringbitmap | roaringbitmap | Executa uma operação ANDNOT. | |
rb_cardinality | roaringbitmap | integer | Calcula a cardinalidade. | |
rb_and_cardinality | roaringbitmap,roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação AND entre dois roaring bitmaps. | |
rb_or_cardinality | roaringbitmap,roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação OR entre dois roaring bitmaps. | |
rb_xor_cardinality | roaringbitmap,roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação XOR entre dois roaring bitmaps. | |
rb_andnot_cardinality | roaringbitmap,roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação ANDNOT entre dois roaring bitmaps. | |
rb_is_empty | roaringbitmap | boolean | Verifica se um roaring bitmap está vazio. | |
rb_equals | roaringbitmap,roaringbitmap | boolean | Verifica se dois roaring bitmaps são iguais. | |
rb_intersect | roaringbitmap,roaringbitmap | boolean | Verifica se há interseção entre dois roaring bitmaps. | |
rb_remove | roaringbitmap,integer | roaringbitmap | Remove um offset específico de um roaring bitmap. | |
rb_flip | roaringbitmap,integer,integer | roaringbitmap | Inverte offsets específicos em um roaring bitmap. | |
rb_minimum | roaringbitmap | integer | Retorna o menor offset em um roaring bitmap. Se o roaring bitmap estiver vazio, retorna -1. | |
rb_maximum | roaringbitmap | integer | Retorna o maior offset em um roaring bitmap. Se o roaring bitmap estiver vazio, retorna 0. | |
rb_rank | roaringbitmap,integer | integer | Retorna o número de elementos menores ou iguais a um offset especificado em um roaring bitmap. | |
rb_iterate | roaringbitmap | setof integer | Retorna uma lista de offsets de um roaring bitmap. | |
Funções agregadas de bitmap
Função | Entrada | Saída | Descrição | Exemplo |
rb_build_agg | integer | roaringbitmap | Cria um roaring bitmap a partir de um grupo de offsets. | |
rb_or_agg | roaringbitmap | roaringbitmap | Executa uma operação agregada OR. | |
rb_and_agg | roaringbitmap | roaringbitmap | Executa uma operação agregada AND. | |
rb_xor_agg | roaringbitmap | roaringbitmap | Executa uma operação agregada XOR. | |
rb_or_cardinality_agg | roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação agregada OR entre dois roaring bitmaps. | |
rb_and_cardinality_agg | roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação agregada AND entre dois roaring bitmaps. | |
rb_xor_cardinality_agg | roaringbitmap | integer | Calcula a cardinalidade resultante de uma operação agregada XOR entre dois roaring bitmaps. | |