Roaring bitmap'ler, birçok programlama dili ve büyük veri platformunda desteklenen verimli sıkıştırılmış bit eşlemleridir. Hologres'te roaring bitmap işlevleri; yinelenen öğeleri kaldırma, etiket tabanlı filtreleme ve zaman serisi toplama gibi ultra yüksek kardinaliteli iş yükleri için uygundur.
Çalışma mekanizması
Bir roaring bitmap, 32 bitlik tamsayıları 2^16 parçaya böler. Aynı parçadaki tamsayılar aynı 16 en anlamlı biti paylaşır; 16 en az anlamlı bit ise bir kapsayıcıda saklanır. Kapsayıcılar, birincil dizin olarak dinamik bir dizi içinde tutulur.
İki tür kapsayıcı, depolama alanı ve performansı dengeler:
| Kapsayıcı türü | Kullanım amacı | Kapasite |
|---|---|---|
| Dizi kapsayıcısı | Seyrek parçalar | 4.096 adede kadar tamsayı |
| Bitmap kapsayıcısı | Yoğun parçalar | 4.096'dan fazla tamsayı |
Bu yapı, hızlı değer erişimi ve kapsayıcılar arasında verimli bit düzeyinde işlemler (AND, OR, XOR) gerçekleştirmeyi sağlar.
Sınırlamalar
-
Yalnızca Hologres V0.10 ve sonraki sürümlerin özel örnekleri roaring bitmap işlevlerini destekler.
Örnek sürümünüzü Hologres konsolunda kontrol edin. Sürüm V0.10'dan önceyse örneği konsolda yükseltin veya teknik destek için DingTalk grubuna katılın. Bkz. Yaygın yükseltme hazırlık hata mesajları ve Hologres için çevrimiçi destek alma .
Roaring bitmap işlevleri varsayılan olarak public şemasına yüklenir ve yalnızca public şemasına yüklenebilir.
Hologres V3.1'den itibaren RoaringBitmap64 veri türü desteklenir. Bazı roaring bitmap işlevleri RoaringBitmap64 türündeki verileri işleyebilir. Bu işlevler RoaringBitmap64 verilerini işlerken sabit giriş parametrelerini desteklemez.
-
Roaring bitmap işlevlerini kullanmadan önce aşağıdaki ifadeyle uzantıyı etkinleştirin. Uzantı veritabanı kapsamındadır; her veritabanı için bu işlemi bir kez çalıştırın. Oluşturduğunuz her yeni veritabanı için tekrarlayın.
-- Enable the extension. CREATE EXTENSION roaringbitmap;Uzantıyı kaldırmak için:
DROP EXTENSION roaringbitmap;ÖnemliDROP EXTENSION <extension_name> CASCADE;kullanımından kaçının. CASCADE seçeneği, uzantıyı tüm verileri ve bağımlı nesnelerle birlikte kaldırır; buna PostGIS verileri, roaring bitmap verileri, Proxima verileri, ikili günlük verileri ve BSI verileri ile bağımlı meta veriler, tablolar, görünümler ve sunucu nesneleri dahildir. Roaring bitmap sütunları bitmap veya sözlük dizini olarak belirtilemez.
-
Roaring bitmap sütunu içeren bir tablo oluştururken sütun türünü açıkça
roaringbitmap(32 bit) veyaroaringbitmap64(64 bit) olarak belirtin. İki tür arasında karma hesaplamalar desteklenmez.-- Create a table with a 32-bit roaring bitmap column. CREATE TABLE t_rb_32 ( bucket int, x roaringbitmap ); -- Create a table with a 64-bit roaring bitmap column. CREATE TABLE t_rb_64 ( bucket int, x roaringbitmap64 ); -- Mixed calculations return an error. -- ERROR: operator does not exist: roaringbitmap & roaringbitmap64 SELECT a.x & b.x FROM t_rb_32 a JOIN t_rb_64 b ON a.bucket = b.bucket;
İşleçler
Aksi belirtilmedikçe aşağıdaki tüm işleçler hem RoaringBitmap hem de RoaringBitmap64 türlerini destekler.
| İşleç | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
& |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Girişle aynı | AND | rb_build('{1,2,3}') & rb_build('{3,4,5}') |
{3} |
| |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Girişle aynı | OR | rb_build('{1,2,3}') | rb_build('{3,4,5}') |
{1,2,3,4,5} |
| |
RoaringBitmap | RoaringBitmap64, INTEGER | RoaringBitmap | RoaringBitmap64 | OR (bitmap, tamsayı); V1.3.16+ | rb_build('{1,2,3}') | 6 |
{1,2,3,6} |
| |
INTEGER, RoaringBitmap | RoaringBitmap64 | RoaringBitmap | RoaringBitmap64 | OR (tamsayı, bitmap); V1.3.16+ | 6 | rb_build('{1,2,3}') |
{1,2,3,6} |
# |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Girişle aynı | XOR | rb_build('{1,2,3}') # rb_build('{3,4,5}') |
{1,2,4,5} |
<< |
RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | Sola kaydırma; V1.3.16+ | rb_build('{1,2,3}') << 2 |
{3,4,5} |
>> |
RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | Sağa kaydırma; V1.3.16+ | rb_build('{1,2,3}') >> 3 |
— |
- |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | Girişle aynı | ANDNOT (bitmap, bitmap); V1.3.16+ | rb_build('{1,2,3}') - rb_build('{3,4,5}') |
{1,2} |
- |
RoaringBitmap | RoaringBitmap64, INTEGER | RoaringBitmap | RoaringBitmap64 | ANDNOT (bitmap, tamsayı) | rb_build('{1,2,3}') - 3 |
{1,2} |
@> |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | A, B'yi içerir | rb_build('{1,2,3}') @> rb_build('{3,4,5}') |
false |
@> |
RoaringBitmap | RoaringBitmap64, INTEGER | BOOLEAN | A, tamsayıyı içerir | rb_build('{1,2,3}') @> 3 |
true |
<@ |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | A, B tarafından kapsanır | rb_build('{1,2,3}') <@ rb_build('{3,4,5}') |
false |
<@ |
INTEGER, RoaringBitmap | RoaringBitmap64 | BOOLEAN | Tamsayı, A tarafından kapsanır | 3 <@ rb_build('{1,2,3}') |
true |
&& |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | A, B ile kesişir | rb_build('{1,2,3}') && rb_build('{3,4,5}') |
true |
= |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | Eşittir | rb_build('{1,2,3}') = rb_build('{3,4,5}') |
false |
<> |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | Eşit değildir | rb_build('{1,2,3}') <> rb_build('{3,4,5}') |
true |
Roaring bitmap işlevleri
Hem RoaringBitmap hem de RoaringBitmap64'ü destekleyen işlevler
| İşlev | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
rb_build_agg |
INTEGER | BIGINT | RoaringBitmap | RoaringBitmap64 | Ofsetleri bir roaring bitmap'te toplar. BIGINT girişi (RoaringBitmap64 döndüren) V3.1+ gerektirir. | rb_build_agg(1) |
{1} |
rb_cardinality |
RoaringBitmap | RoaringBitmap64 | INTEGER | Bir roaring bitmap'teki öğe sayısını döndürür. | rb_cardinality(rb_build('{1,2,3,4,5}')) |
5 |
rb_and_cardinality |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | INTEGER | İki roaring bitmap'in AND işleminin kardinalitesini döndürür. | rb_and_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
1 |
rb_or_cardinality |
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | INTEGER | İki roaring bitmap'in OR işleminin kardinalitesini döndürür. | rb_or_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
5 |
rb_range |
RoaringBitmap | RoaringBitmap64, BIGINT, BIGINT | RoaringBitmap | RoaringBitmap64 | [başlangıç, bitiş) aralığındaki öğeleri döndürür; başlangıç 1 tabanlıdır. V1.3.16+ gerektirir. | rb_range(rb_build('{1,2,3}'), 2, 3) |
— |
rb_minimum |
RoaringBitmap | RoaringBitmap64 | INTEGER | Minimum ofseti döndürür. Bitmap boşsa -1 döndürür. | rb_minimum(rb_build('{1,2,3}')) |
1 |
rb_maximum |
RoaringBitmap | RoaringBitmap64 | INTEGER | Maksimum ofseti döndürür. Bitmap boşsa 0 döndürür. | rb_maximum(rb_build('{1,2,3}')) |
3 |
rb_to_array |
RoaringBitmap | RoaringBitmap64 | INTEGER[] | Bir roaring bitmap'i tamsayı dizisine dönüştürür. | rb_to_array(rb_build('{1,2,3}')) |
{1,2,3} |
rb_to_array_string |
RoaringBitmap | RoaringBitmap64, TEXT | TEXT | Bir roaring bitmap'i belirtilen ayırıcıyla birleştirerek bir dizeye dönüştürür. | rb_to_array_string(rb_build('{1,2,3}'), ',') |
1,2,3 |
Yalnızca RoaringBitmap64'ü destekleyen işlevler
| İşlev | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
rb64_build |
BIGINT[] | RoaringBitmap64 | Bir BIGINT dizisinden 64 bitlik bir roaring bitmap oluşturur. V3.1+ gerektirir. | Aşağıdaki örneğe bakın. | — |
-- Prepare data.
CREATE TABLE public.tn (
id INT,
num BIGINT[]
);
INSERT INTO public.tn ("id", "num") VALUES (01, '{1,2}');
SELECT rb64_build(num) rb_num, num FROM public.tn;
Beklenen çıktı:
rb_num | num
--------------------------------------------------------------------------------+------
\x030100000000000000000000003a30000001000000000001001000000001000200 | {1,2}
Yalnızca RoaringBitmap'i (32 bit) destekleyen işlevler
| İşlev | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
rb_build |
INTEGER[] | RoaringBitmap | Bir tamsayı dizisinden 32 bitlik bir roaring bitmap oluşturur. | rb_build('{1,2,3,4,5}') |
{1,2,3,4,5} |
roaringbitmap_in |
TEXT | RoaringBitmap | Metin olarak kodlanmış bir roaring bitmap'i RoaringBitmap türüne dönüştürür. V2.1.33+ gerektirir. | Aşağıdaki örneğe bakın. | — |
rb_index |
RoaringBitmap, INTEGER | BIGINT | Bir öğenin 0 tabanlı dizinini döndürür. Öğe yoksa -1 döndürür. V1.3.16+ gerektirir. | rb_index(rb_build('{1,2,3}'), 3) |
2 |
rb_and_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | AND işlemi. Girişlerden biri NULL ise diğer girişi döndürür; girişlerden biri boş bitmap ({}) ise {} döndürür. V1.1.42+ gerektirir. | rb_and_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{} |
rb_or_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | OR işlemi; NULL girişleri boş bitmap olarak kabul eder. V1.1.42+ gerektirir. | rb_or_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{3,4,5} |
rb_andnot_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | ANDNOT işlemi; NULL girişleri boş bitmap olarak kabul eder. V1.1.42+ gerektirir. | rb_andnot_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{} |
rb_and_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | AND kardinalitesini döndürür. NULL girişleri boş bitmap ({}) olarak kabul eder. V1.1.42+ gerektirir. | rb_and_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
0 |
rb_or_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | OR kardinalitesini döndürür; NULL girişleri boş bitmap olarak kabul eder. V1.1.42+ gerektirir. | rb_or_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
3 |
rb_xor_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | İki roaring bitmap'in XOR işleminin kardinalitesini döndürür. | rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
4 |
rb_andnot_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | İki roaring bitmap'in ANDNOT işleminin kardinalitesini döndürür. | rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
2 |
rb_andnot_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | ANDNOT kardinalitesini döndürür; NULL girişleri boş bitmap olarak kabul eder. V1.1.42+ gerektirir. | rb_andnot_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
0 |
rb_is_empty |
RoaringBitmap | BOOLEAN | Bir roaring bitmap'in boş olup olmadığını kontrol eder. | rb_is_empty(rb_build('{1,2,3,4,5}')) |
false |
rb_fill |
RoaringBitmap, BIGINT, BIGINT | RoaringBitmap | [başlangıç, bitiş) aralığındaki ofsetleri doldurur; bitiş hariçtir. V1.3.16+ gerektirir. | rb_fill(rb_build('{1,2,3}'), 5, 7) |
{1,2,3,5,6} |
rb_clear |
RoaringBitmap, BIGINT, BIGINT | RoaringBitmap | [başlangıç, bitiş) aralığındaki ofsetleri temizler; bitiş hariçtir. V1.3.16+ gerektirir. | rb_clear(rb_build('{1,2,3}'), 2, 3) |
— |
rb_contains_bitmap |
RoaringBitmap, RoaringBitmap | BOOLEAN | İlk bitmap'in ikinci bitmap'in tüm öğelerini içerip içermediğini kontrol eder. | rb_contains_bitmap(rb_build('{1,2,3}'), rb_build('{3}')) |
true |
rb_flip |
RoaringBitmap, INTEGER, INTEGER | RoaringBitmap | Belirtilen aralıktaki ofsetleri tersine çevirir. | rb_flip(rb_build('{1,2,3}'), 2, 3) |
— |
rb_range_cardinality |
RoaringBitmap, BIGINT, BIGINT | BIGINT | [başlangıç, bitiş) aralığındaki öğelerin kardinalitesini döndürür; başlangıç 1 tabanlıdır. V1.3.16+ gerektirir. | rb_range_cardinality(rb_build('{1,2,3}'), 2, 3) |
— |
rb_rank |
RoaringBitmap, INTEGER | INTEGER | Belirtilen ofsetten küçük veya ona eşit olan öğelerin sayısını döndürür. | rb_rank(rb_build('{1,2,3}'), 3) |
3 |
rb_jaccard_dist |
RoaringBitmap, RoaringBitmap | DOUBLE PRECISION | İki roaring bitmap arasındaki Jaccard uzaklığını veya Jaccard benzerlik katsayısını döndürür. V1.3.16+ gerektirir. | rb_jaccard_dist(rb_build('{1,2,3}'), rb_build('{3,4}')) |
0.75 |
rb_select |
RoaringBitmap, bitset_limit BIGINT, bitset_offset BIGINT=0, reverse BOOLEAN=false, range_start BIGINT=-2147483648, range_end BIGINT=2147483647 | RoaringBitmap | [range_start, range_end) aralığının [bitset_offset, bitset_offset+bitset_limit) alt kümesini döndürür. | rb_select(rb_build('{1,2,3,4,5,6,7,8,9}'), 5, 2) |
— |
rb_iterate |
RoaringBitmap | Set of INTEGER | Bir roaring bitmap'teki her ofseti bir satır olarak döndürür. | rb_iterate(rb_build('{1,2,3}')) |
1, 2, 3 |
roaringbitmap_in örneği:
-- Create a sample table.
CREATE TABLE rb_text (
id int,
a text
);
-- Insert data.
INSERT INTO rb_text
VALUES (1, '\x3a300000010000000000090010000000010002000300040005000600070008000900c800');
-- Convert to RoaringBitmap and compute AND cardinality.
SELECT
rb_and_cardinality_agg(roaringbitmap_in(a::cstring))
FROM
rb_text;
Beklenen çıktı:
rb_and_cardinality_agg
------------------------
10
Roaring bitmap toplama işlevleri
Hem RoaringBitmap hem de RoaringBitmap64'ü destekleyen işlevler
Aşağıdaki tüm örnekler, toplamaların birden çok bitmap'i nasıl birleştirdiğini göstermek için çok satırlı giriş kullanır.
| İşlev | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
rb_or_agg |
RoaringBitmap | RoaringBitmap64 | Girişle aynı | Tüm giriş satırları üzerinde OR toplamı. | Aşağıdaki örneğe bakın. | — |
rb_and_agg |
RoaringBitmap | RoaringBitmap64 | Girişle aynı | Tüm giriş satırları üzerinde AND toplamı. | Aşağıdaki örneğe bakın. | — |
rb_or_cardinality_agg |
RoaringBitmap | RoaringBitmap64 | INTEGER | OR toplamının kardinalitesini döndürür. | Aşağıdaki örneğe bakın. | — |
rb_and_cardinality_agg |
RoaringBitmap | RoaringBitmap64 | INTEGER | AND toplamının kardinalitesini döndürür. | Aşağıdaki örneğe bakın. | — |
-- OR aggregate: returns the union of all input bitmaps.
SELECT rb_or_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {1,2,3,4}
-- AND aggregate: returns the intersection of all input bitmaps.
SELECT rb_and_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {2,3}
-- OR cardinality aggregate.
SELECT rb_or_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 4
-- AND cardinality aggregate.
SELECT rb_and_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 2
Yalnızca RoaringBitmap'i (32 bit) destekleyen işlevler
| İşlev | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
rb_xor_agg |
RoaringBitmap | RoaringBitmap | Tüm giriş satırları üzerinde XOR toplamı. | Aşağıdaki örneğe bakın. | — |
rb_xor_cardinality_agg |
RoaringBitmap | INTEGER | XOR toplamının kardinalitesini döndürür. | Aşağıdaki örneğe bakın. | — |
-- XOR aggregate: returns elements in exactly one of the two bitmaps.
SELECT rb_xor_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {1,4}
-- XOR cardinality aggregate.
SELECT rb_xor_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 2
Diğer roaring bitmap işlevleri
Aşağıdaki işlevler yalnızca RoaringBitmap (32 bit) türünü destekler.
| İşlev | Giriş türü | Çıkış türü | Açıklama | Örnek | Sonuç |
|---|---|---|---|---|---|
roaringbitmap_text |
TEXT, BOOLEAN | RoaringBitmap | İkili RoaringBitmap verisini metinden bir RoaringBitmap yapısına serileştirir. İkinci parametre biçim doğrulamasını kontrol eder; geçersiz bitmap verilerinden kaçınmak için true olarak ayarlayın. |
roaringbitmap_text(':0', true) |
— |
rb_to_text |
RoaringBitmap | TEXT | Bir RoaringBitmap yapısını ikili metin temsilatine dönüştürür. | rb_to_text(rb_build('{1,2,3}')) |
\x3a300000... |
Örnekler
Aşağıdaki uçtan uca örnek, eksiksiz bir iş akışı gösterir: uzantıyı etkinleştirme, tablo oluşturma, veri ekleme, bit düzeyinde işlemler çalıştırma ve sonuçları inceleme.
-
Uzantıyı etkinleştirin.
CREATE EXTENSION roaringbitmap; -
Roaring bitmap verilerini depolamak için bir tablo oluşturun.
-- Create table t1. CREATE TABLE public.t1 (id integer, bitmap roaringbitmap); -
Roaring bitmap verilerini ekleyin.
-- Build a bitmap from an explicit array. INSERT INTO public.t1 SELECT 1, RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- Build a bitmap by aggregating a generated series. INSERT INTO public.t1 SELECT 2, RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e; -
Bit düzeyinde işlemleri çalıştırın.
-- OR the two bitmaps. SELECT RB_OR(a.bitmap, b.bitmap) FROM (SELECT bitmap FROM public.t1 WHERE id = 1) AS a, (SELECT bitmap FROM public.t1 WHERE id = 2) AS b;Beklenen çıktı ({1..9, 200} ve {1..100} kümelerinin birleşimi):
rb_or ------- {1,2,3,4,5,6,7,8,9,10,...,100,200} -
Tablodaki tüm bitmap'leri birleştirmek için toplama işlemlerini çalıştırın.
SELECT RB_OR_AGG(bitmap) FROM public.t1; -- union of all bitmaps SELECT RB_AND_AGG(bitmap) FROM public.t1; -- intersection of all bitmaps SELECT RB_XOR_AGG(bitmap) FROM public.t1; -- symmetric difference SELECT RB_BUILD_AGG(id) FROM public.t1; -- build a bitmap from the id column -
Kardinaliteyi (ayarlanan bitlerin sayısını) hesaplayın.
SELECT RB_CARDINALITY(bitmap) FROM public.t1;Beklenen çıktı:
id | rb_cardinality ----+---------------- 1 | 10 2 | 100 -
Tüm ayarlanan ofsetleri listeleyin.
SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;Beklenen çıktı:
rb_iterate ------------ 1 2 3 4 5 6 7 8 9 200 -
Bir roaring bitmap'i bir diziye dönüştürün.
SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;Beklenen çıktı:
rb_to_array -------------------------------- {1,2,3,4,5,6,7,8,9,200}