Bu konu, ApsaraDB RDS for PostgreSQL tarafından sağlanan roaringbitmap uzantısının sorgu performansını artırmak amacıyla nasıl kullanılacağını açıklar.
Ön koşullar
RDS örneği PostgreSQL 12 veya sonraki bir sürümde çalışır.
RDS örneğiniz PostgreSQL 17 üzerinde çalışıyorsa, örneğin küçük motor sürümü 20241030 veya daha yeni olmalıdır.
Arka plan bilgileri
Roaring bitmap yapısında 32 bitlik tamsayılar 216 parçaya ayrılır. Her bir parçadaki tamsayılar aynı 16 en anlamlı biti paylaşır. Tamsayıların 16 en az anlamlı biti bir konteynerde saklanır. Roaring bitmap, konteynerleri birincil dizinler olarak dinamik bir dizi içinde tutar. İki tür konteyner mevcuttur: seyrek parçalar için dizi konteynerleri ve yoğun parçalar için bitmap konteynerleri. Bir dizi konteyneri en fazla 4.096 tamsayı saklayabilir. Bir bitmap konteyneri ise 4.096'dan fazla tamsayı saklayabilir.
Roaring bitmapler, bu depolama yapısını kullanarak belirli değerlere hızla erişebilir. Ayrıca, iki konteyner türü arasında AND, OR ve XOR gibi bit düzeyinde işlemler sağlar. Bu sayede roaring bitmapler üstün depolama ve hesaplama performansı sunar.
Kullanım notları
Uzantının kararlılığını sağlamak için RDS örneğinizi en son küçük motor sürümüne güncellemenizi öneririz.
Bir RDS örneğinin küçük motor sürümünü nasıl güncelleyeceğiniz hakkında daha fazla bilgi için bkz. Küçük motor sürümünü yükseltme.
Yordam
-
Uzantıyı oluşturun. Örnek:
CREATE EXTENSION roaringbitmap; -
Roaringbitmap verilerini saklamak için bir tablo oluşturun. Örnek:
CREATE TABLE t1 (id integer, bitmap roaringbitmap); -
Roaringbitmap verilerini eklemek için rb_build işlevini çağırın. Örnek:
-- 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; -
OR, AND, XOR ve ANDNOT gibi bitmap işlemleri uygulayın. Örnek:
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; -
Yeni bir roaring bitmap oluşturmak için OR, AND, XOR ve BUILD gibi bitmap toplu işlemleri uygulayın. Örnek:
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; -
Roaring bitmap'in kardinalitesini hesaplayın. Kardinalite, roaring bitmap içinde 1 olarak ayarlanmış bitlerin sayısıdır. Örnek:
SELECT RB_CARDINALITY(bitmap) FROM t1; -
1 olarak ayarlanmış bitlerin alt indislerini alın. Örnek:
SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;
Bitmap hesaplama işlevleri
İşlev | Giriş | Çıktı | Açıklama | Örnek |
rb_build | integer[] | roaringbitmap | Bir tamsayı dizisinden bir roaring bitmap oluşturur. | |
rb_and | roaringbitmap,roaringbitmap | roaringbitmap | AND işlemi uygular. | |
rb_or | roaringbitmap,roaringbitmap | roaringbitmap | OR işlemi uygular. | |
rb_xor | roaringbitmap,roaringbitmap | roaringbitmap | XOR işlemi uygular. | |
rb_andnot | roaringbitmap,roaringbitmap | roaringbitmap | ANDNOT işlemi uygular. | |
rb_cardinality | roaringbitmap | integer | Kardinaliteyi hesaplar. | |
rb_and_cardinality | roaringbitmap,roaringbitmap | integer | İki roaring bitmap üzerinde yapılan AND işleminden kardinaliteyi hesaplar. | |
rb_or_cardinality | roaringbitmap,roaringbitmap | integer | İki roaring bitmap üzerinde yapılan OR işleminden kardinaliteyi hesaplar. | |
rb_xor_cardinality | roaringbitmap,roaringbitmap | integer | İki roaring bitmap üzerinde yapılan XOR işleminden kardinaliteyi hesaplar. | |
rb_andnot_cardinality | roaringbitmap,roaringbitmap | integer | İki roaring bitmap üzerinde yapılan ANDNOT işleminden kardinaliteyi hesaplar. | |
rb_is_empty | roaringbitmap | boolean | Bir roaring bitmap'in boş olup olmadığını denetler. | |
rb_equals | roaringbitmap,roaringbitmap | boolean | İki roaring bitmap'in aynı olup olmadığını denetler. | |
rb_intersect | roaringbitmap,roaringbitmap | boolean | İki roaring bitmap'in kesişip kesişmediğini denetler. | |
rb_remove | roaringbitmap,integer | roaringbitmap | Bir roaring bitmap'ten belirli bir ofseti kaldırır. | |
rb_flip | roaringbitmap,integer,integer | roaringbitmap | Bir roaring bitmap'te belirli ofsetleri tersine çevirir. | |
rb_minimum | roaringbitmap | integer | Bir roaring bitmap'teki en küçük ofseti döndürür. Roaring bitmap boşsa -1 döndürülür. | |
rb_maximum | roaringbitmap | integer | Bir roaring bitmap'teki en büyük ofseti döndürür. Roaring bitmap boşsa 0 döndürülür. | |
rb_rank | roaringbitmap,integer | integer | Bir roaring bitmap'te belirtilen bir ofsetten küçük veya ona eşit olan öğelerin sayısını döndürür. | |
rb_iterate | roaringbitmap | setof integer | Bir roaring bitmap'ten ofset listesi döndürür. | |
Bitmap toplu işlevleri
İşlev | Giriş | Çıktı | Açıklama | Örnek |
rb_build_agg | integer | roaringbitmap | Bir grup ofsetten bir roaring bitmap oluşturur. | |
rb_or_agg | roaringbitmap | roaringbitmap | OR toplu işlemi uygular. | |
rb_and_agg | roaringbitmap | roaringbitmap | AND toplu işlemi uygular. | |
rb_xor_agg | roaringbitmap | roaringbitmap | XOR toplu işlemi uygular. | |
rb_or_cardinality_agg | roaringbitmap | integer | İki roaring bitmap üzerinde yapılan OR toplu işleminden kardinaliteyi hesaplar. | |
rb_and_cardinality_agg | roaringbitmap | integer | İki roaring bitmap üzerinde yapılan AND toplu işleminden kardinaliteyi hesaplar. | |
rb_xor_cardinality_agg | roaringbitmap | integer | İki roaring bitmap üzerinde yapılan XOR toplu işleminden kardinaliteyi hesaplar. | |