Bit-sliced index (BSI) fonksiyonları, büyük kullanıcı segmentleri üzerinde yüksek performanslı toplama ve filtreleme işlemleri gerçekleştirmek için anahtar-değer verilerini bitmap tabanlı bir yapıda sıkıştıran Hologres uzantı fonksiyonlarıdır.
Nasıl çalışır
Bir BSI, cid::int, value::bigint formatındaki anahtar-değer çiftlerini sıkıştırır. Her ondalık değer ikili sisteme dönüştürülür ve ikili veri düşük bitten yüksek bite doğru taranır. Bit konumu 1 olan tüm cid değerlerinin roaring bitmap'i her bit pozisyonu için bir dilim olarak kaydedilir ve bu şekilde BSI yapısı oluşturulur.
Aşağıdaki örnek veriler bu prensibi göstermektedir:
| cid | Değer (ondalık) | Değer (ikili) |
|---|---|---|
| 1 | 3 | 0011 |
| 2 | 6 | 0110 |
| 3 | 4 | 0100 |
| 4 | 10 | 1010 |
| 5 | 7 | 0111 |
| 6 | NULL | - |
Maksimum ondalık değer 10'dur ve bu değer 4 bit gerektirir. Bu verilerden üretilen BSI dört dilim içerir:
dilim 0: roaringbitmap
{1,5}dilim 1: roaringbitmap
{1,2,4,5}dilim 2: roaringbitmap
{2,3,5}dilim 3: roaringbitmap
{4}
Her BSI ayrıca aşağıdaki dahili meta verileri de saklar:
| Alan | Açıklama | Örnekteki değer |
|---|---|---|
EBM (varlık bitmap'i) |
NULL olmayan tüm cid değerlerinin roaring bitmap'i | {1,2,3,4,5} |
max |
Maksimum değer | 10 |
min |
Minimum değer | 3 |
bitCount |
İkili temsil için kullanılan bit sayısı | 4 |
Seçilen kitle {1,3,5} için örnek hesaplamalar:
Toplam:
rb_and_cardinality(crowd, slice0) × 2<sup>0</sup>+ ... + rb_and_cardinality(crowd, slice3) × 2<sup>3</sup>= 14-
En büyük 2 değer:
crowd & slice3 = NULL crowd & slice2 = {3,5} -- top 2 values are {3,5} {3,5} & slice1 = {5} -- top 1 value is {5}
BSI, roaring bitmap küme işlemlerini değer hesaplamalarıyla birleştirir; bu durum, hem öznitelik etiketleri hem de davranış etiketleri kullanan kullanıcı profili analiz senaryolarında verimlilik sağlar. Pratik bir örnek için bkz. BSI (beta).
Sınırlamalar
Sürüm gereksinimi: Hologres V2.1 ve sonraki sürümler. Daha eski bir örneği yükseltmek için bkz. Örnekleri yükseltme.
Value range: Bir BSI içindeki her değer 1 ile 2<sup>31</sup> − 1 arasında bir tam sayı olmalıdır.
-
Uzantılar: BSI kullanmadan önce süper kullanıcı tarafından veritabanı düzeyinde iki uzantının oluşturulması gerekir. Her uzantıyı veritabanı başına yalnızca bir kez oluşturun.
ÖnemliDROP EXTENSION <extension_name> CASCADE;komutunu kullanmayın.CASCADEseçeneği, uzantıyı silmenin yanı sıra PostGIS verileri, roaring bitmap verileri, Proxima verileri, binary log verileri, BSI verileri, meta veriler, tablolar, görünümler ve sunucu verileri dahil olmak üzere tüm bağımlı nesneleri ve bunların verilerini de siler.-- Create extensions. Create roaring bitmaps before creating BSI. CREATE EXTENSION roaringbitmap; CREATE EXTENSION bsi; -- Drop the extensions. DROP EXTENSION bsi; DROP EXTENSION roaringbitmap;
Fonksiyonlar
BSI oluşturucular
bsi_build
İki paralel tek boyutlu diziden bir BSI oluşturur.
Sözdizimi
bsi_build(cids integer[], values bigint[]) → bsi
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
cids |
integer[] |
Anahtar değerleri (cid) dizisi |
values |
bigint[] |
cids ile hizalanmış karşılık gelen değerler dizisi |
Döndürür: bsi
Örnek
SELECT bsi_iterate(bsi_build('{1,2,3}', '{2,4,6}'));
Çıktı:
{1,2}
{2,4}
{3,6}
bsi_add_value
Mevcut bir BSI'ye tek bir anahtar-değer çifti ekler.
Sözdizimi
bsi_add_value(b bsi, cid integer, value bigint) → bsi
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b |
bsi |
Mevcut BSI |
cid |
integer |
Eklenecek anahtar |
value |
bigint |
cid ile ilişkili değer |
Döndürür: bsi
Örnek
SELECT bsi_iterate(bsi_add_value(bsi_build('{1,2,3}', '{2,4,6}'), 4, 8));
Çıktı:
{1,2}
{2,4}
{3,6}
{4,8}
BSI genişletme fonksiyonları
bsi_iterate
Bir BSI'yi anahtar-değer çiftlerine genişletir ve her çift için bir satır döndürür.
Sözdizimi
bsi_iterate(b bsi) → set of integer[]
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b |
bsi |
Genişletilecek BSI |
Döndürür: set of integer[] — her satır {cid, value} biçimindedir
Örnek
SELECT bsi_iterate(bsi_build('{1,2,3}', '{2,4,6}'));
Çıktı:
{1,2}
{2,4}
{3,6}
bsi_show
Bir BSI'den ilk N anahtar-değer çiftini biçimlendirilmiş bir metin dizesi olarak döndürür.
Sözdizimi
bsi_show(b bsi, n integer) → text
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b |
bsi veya bytea |
İncelenecek BSI |
n |
integer |
Görüntülenecek anahtar-değer çifti sayısı |
Döndürür: text — kalan çiftlerin sayısının ardından gelen ilk N çift
Örnek
SELECT bsi_show(bsi_build('{1,2,3}', '{2,4,6}'), 2);
Çıktı:
1=2,2=4...left 1
BSI sorgu fonksiyonları
Karşılaştırma fonksiyonları (bsi_eq, bsi_ge, bsi_gt, bsi_le, bsi_lt, bsi_neq, bsi_range) hepsi isteğe bağlı bir bytea filtre parametresini destekler. Sağlandığında, fonksiyon önce BSI'nin EBM'sini filtre bitmap'i ile kesiştirir, ardından karşılaştırmayı elde edilen alt küme üzerinde gerçekleştirir.
bsi_ebm
Bir BSI'nin varlık bitmap'ini (EBM) — yani NULL olmayan tüm cid değerlerinin roaring bitmap'ini — döndürür.
Sözdizimi
bsi_ebm(b bsi) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_ebm(bsi_build('{1,2,3}', '{2,4,6}')));
Çıktı: {1,2,3}
bsi_filter
Yalnızca BSI'nin EBM'si ve verilen bitmap'te ortak olarak bulunan cid değerlerini içeren yeni bir BSI döndürür.
Sözdizimi
bsi_filter(b bsi, crowd bytea) → bsi
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b |
bsi veya bytea |
Kaynak BSI |
crowd |
bytea |
EBM'yi filtrelemek için kullanılan ve bytea biçimine serileştirilmiş bir roaring bitmap |
Döndürür: bsi
Örnek
SELECT bsi_iterate(bsi_filter(bsi_build('{1,2,3}', '{2,4,6}'), rb_build('{1,2}')));
Çıktı:
{1,2}
{2,4}
bsi_eq
BSI değeri verilen eşik değerine eşit olan cid değerlerini döndürür.
Sözdizimi
bsi_eq(b bsi, threshold bigint [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_eq(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 4));
Çıktı: {2,3}
bsi_neq
BSI değeri verilen eşik değerine eşit olmayan cid değerlerini döndürür.
Sözdizimi
bsi_neq(b bsi, threshold bigint [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_neq(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 4));
Çıktı: {1,4}
bsi_lt
BSI değeri verilen eşik değerinden küçük olan cid değerlerini döndürür.
Sözdizimi
bsi_lt(b bsi, threshold bigint [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_lt(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 4));
Çıktı: {1}
bsi_le
BSI değeri verilen eşik değerinden küçük veya ona eşit olan cid değerlerini döndürür.
Sözdizimi
bsi_le(b bsi, threshold bigint [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_le(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 4));
Çıktı: {1,2,3}
bsi_gt
BSI değeri verilen eşik değerinden büyük olan cid değerlerini döndürür.
Sözdizimi
bsi_gt(b bsi, threshold bigint [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_gt(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 4));
Çıktı: {4}
bsi_ge
BSI değeri verilen eşik değerinden büyük veya ona eşit olan cid değerlerini döndürür.
Sözdizimi
bsi_ge(b bsi, threshold bigint [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_ge(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 4));
Çıktı: {2,3,4}
bsi_range
BSI değeri belirtilen iki eşik değeri arasında kalan cid değerlerini döndürür.
Sözdizimi
bsi_range(b bsi, lower bigint, upper bigint [, crowd bytea]) → roaringbitmap
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b |
bsi |
Kaynak BSI |
lower |
bigint |
Aralığın alt sınırı |
upper |
bigint |
Aralığın üst sınırı |
crowd |
bytea |
(İsteğe bağlı) EBM'yi önceden filtrelemek için serileştirilmiş roaring bitmap |
Örnek
SELECT rb_to_array(bsi_range(bsi_build('{1,2,3,4}', '{2,4,4,8}'), 3, 5));
Çıktı: {2,3}
bsi_compare
Tek bir giriş noktası üzerinden tüm karşılaştırma türlerini destekleyen birleşik bir karşılaştırma fonksiyonudur.
Sözdizimi
bsi_compare(op text, b bsi [, crowd bytea], val1 bigint [, val2 bigint]) → roaringbitmap
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
op |
text |
Karşılaştırma türü: LT, LE, GT, GE, EQ, NEQ veya RANGE |
b |
bsi |
Kaynak BSI |
crowd |
bytea |
(İsteğe bağlı) EBM'yi önceden filtrelemek için serileştirilmiş roaring bitmap |
val1 |
bigint |
Karşılaştırma değeri (RANGE için alt sınır) |
val2 |
bigint |
(Yalnızca RANGE için gereklidir) Üst sınır |
Örnek
SELECT rb_to_array(bsi_compare('RANGE', bsi_build('{1,2,3,4}', '{2,4,4,8}'), 3, 5));
Çıktı: {2,3}
BSI toplam ve analitik fonksiyonları
bsi_sum
BSI değerlerinin toplamını ve eşleşen cid değerlerinin sayısını (EBM kardinalitesi) iki elemanlı bir dizi olarak döndürür.
Sözdizimi
bsi_sum(b bsi [, crowd bytea]) → bigint[]
Döndürür: bigint[] — {sum, cardinality}
Örnek
SELECT bsi_sum(bsi_build('{1,2,3,4}', '{2,4,6,8}'));
Çıktı: {20,4}
bsi_topk
En büyük K BSI değerine sahip olan cid değerlerini döndürür.
Sözdizimi
bsi_topk(b bsi [, crowd bytea], k integer) → roaringbitmap
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b |
bsi veya bytea |
Kaynak BSI |
crowd |
bytea |
(İsteğe bağlı) EBM'yi önceden filtrelemek için serileştirilmiş roaring bitmap |
k |
integer |
Döndürülecek en büyük değer sayısı |
Örnek
SELECT rb_to_array(bsi_topk(bsi_build('{1,2,3,4,5}', '{2,4,6,8,10}'), 3));
Çıktı: {3,4,5}
bsi_stat
Kullanıcı tanımlı aralıklar genelinde bir BSI'nin değer dağılımını döndürür.
Sözdizimi
bsi_stat(boundaries bigint[], b bsi [, crowd bytea]) → text
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
boundaries |
bigint[] |
Dağılım aralıklarını tanımlayan sınır değerleri dizisi |
b |
bsi veya bytea |
Kaynak BSI |
crowd |
bytea |
(İsteğe bağlı) EBM'yi önceden filtrelemek için serileştirilmiş roaring bitmap |
Döndürür: text — (lower,upper]=count biçiminde sayaçlarla birlikte aralık aralıkları
Örnek
SELECT bsi_stat('{1,3,5}', bsi_build('{1,2,3,4}', '{2,4,6,8}'));
Çıktı: (0,1]=0;(1,3]=1;(3,5]=1;(5,8]=2
bsi_add
EBM'lerinde ortak cid değerleri için iki BSI'nin değerlerini toplar ve yeni bir BSI döndürür.
Sözdizimi
bsi_add(b1 bsi, b2 bsi) → bsi
Bağımsız değişkenler
| Bağımsız değişken | Tür | Açıklama |
|---|---|---|
b1 |
bsi |
İlk BSI |
b2 |
bsi |
İkinci BSI |
Örnek
SELECT bsi_iterate(bsi_add(bsi_build('{1,2,3}', '{2,4,6}'), bsi_build('{1,2}', '{2,4}')));
Çıktı:
{1,4}
{2,8}
{3,6}
bsi_add_agg
Birden çok satır genelinde BSI değerlerini toplayan toplam fonksiyonu.
Sözdizimi
bsi_add_agg(b bsi) → bsi
Örnek
SELECT bsi_iterate(bsi_add_agg(bsi_build('{1,2,3}', '{2,4,6}')));
Çıktı:
{1,2}
{2,4}
{3,6}
bsi_merge
EBM'leri örtüşmeyen iki BSI'yi birleştirir. Ayrık veri bölümlerini birleştirirken bu fonksiyonu kullanın.
Sözdizimi
bsi_merge(b1 bsi, b2 bsi) → bsi
Örnek
SELECT bsi_iterate(bsi_merge(bsi_build('{1,2}', '{2,4}'), bsi_build('{3,4}', '{6,8}')));
Çıktı:
{1,2}
{2,4}
{3,6}
{4,8}
bsi_merge_agg
Birden çok BSI satırını tek bir BSI'de birleştiren toplam fonksiyonu. Giriş BSI'lerinin EBM'leri örtüşmemelidir.
Sözdizimi
bsi_merge_agg(b bsi) → bsi
Örnek
SELECT bsi_iterate(bsi_merge_agg(bsi_build('{1,2,3}', '{2,4,6}')));
Çıktı:
{1,2}
{2,4}
{3,6}
bsi_transpose
BSI'deki farklı değerlerin yinelensiz kümesini bir roaring bitmap olarak döndürür.
Sözdizimi
bsi_transpose(b bsi [, crowd bytea]) → roaringbitmap
Örnek
SELECT rb_to_array(bsi_transpose(bsi_build('{1,2,3,4,5}', '{2,4,4,8,8}')));
Çıktı: {2,4,8}
bsi_transpose_with_count
Her farklı değerin, o değere sahip cid girdilerinin sayısıyla eşlendiği yeni bir BSI döndürür.
Sözdizimi
bsi_transpose_with_count(b bsi [, crowd bytea]) → bsi
Örnek
SELECT bsi_iterate(bsi_transpose_with_count(bsi_build('{1,2,3,4,5}', '{2,4,4,8,8}')));
Çıktı:
{2,1}
{4,2}
{8,2}
Çıktıdaki {value, count} şu anlama gelir: 2 değeri bir kez, 4 değeri iki kez ve 8 değeri iki kez görünür.
Sonraki adımlar
BSI (beta) — BSI fonksiyonlarını kullanan kullanıcı profili analizi için uçtan uca örnek