Dictionary encoding — takrorlanadigan qiymatlarni lug‘atdagi noyob yozuvlar va ularga ishora qiluvchi ixcham kodlar bilan almashtirish usulidir. Masalan, million satrli region ustunida faqat o‘n ikki nom uchrasa, har satrda to‘liq matnni saqlash o‘rniga nomlar bir marta lug‘atga yoziladi va satrlarda kichik butun identifikatorlar saqlanadi. Usul siqish, taqqoslash va ustunli tahlilni tezlashtirishi mumkin.
Tuzilishi
Kodlovchi kirish qiymatlaridan noyob to‘plam hosil qiladi. Lug‘atdagi har qiymatga 0..n-1 oralig‘ida kod beriladi. Ma’lumot oqimi keyin shu kodlar ketma-ketligiga aylanadi. Agar lug‘atda 200 ta qiymat bo‘lsa, kodni sakkiz bit bilan ifodalash mumkin; milliardlab takroriy matn o‘rniga har satrga bir baytga yaqin indeks yetadi.
Lug‘at fayl, row group, sahifa yoki butun jadval miqyosida bo‘lishi mumkin. Mahalliy lug‘at kichik va tez yuklanadi, ammo turli bo‘laklardagi bir xil qiymat boshqa kodga ega bo‘lishi mumkin. Global lug‘at kodlarni barqaror qiladi va bo‘laklararo taqqoslashni yengillashtiradi, biroq uni yangilash hamda tarqatish murakkabroq.
So‘rov bajarish
Filtr qiymati avval lug‘atdan qidirilib, mos kodga aylantirilsa, millionlab uzun satr o‘rniga kichik sonlar taqqoslanadi. GROUP BY va hisoblashlar ham kodlar ustida bajarilib, faqat yakuniy natijada matn qayta olinishi mumkin. Lug‘at tartiblangan bo‘lsa, ayrim diapazonli predikatlar kod diapazoniga aylantiriladi; tartiblanmagan identifikatorlarda bunday xususiyat kafolatlanmaydi.
Dictionary encoding umumiy kompressorga ham yordam beradi. Kodlar kichik va taqsimoti notekis bo‘lsa, bit packing yoki run-length encoding bilan yanada ixchamlanadi. Null qiymatlar odatda alohida bitmap yoki maxsus kod orqali ko‘rsatiladi.
Samaradorlik chegarasi
Usul past yoki o‘rta cardinalityli ustunlarda foydali. Har satr deyarli noyob bo‘lgan UUID, uzun tasodifiy identifikator yoki erkin matnda lug‘atning o‘zi katta bo‘lib, kod oqimi bilan qo‘shilganda asl ma’lumotdan ko‘proq joy egallashi mumkin. Kodlovchi shu sababli lug‘at hajmi yoki noyob qiymatlar ulushi chegaraga yetganda plain encodingga o‘tadi.
Oqimli ma’lumotda lug‘at oldindan noma’lum. Yangi qiymat kelganda lug‘at kengaytiriladi, yangi sahifa ochiladi yoki overflow yo‘li ishlatiladi. Parallel yozuvchilar bir xil qiymatga ikki kod bermasligi uchun koordinatsiya talab qilinadi. O‘zgarmas analitik faylda esa lug‘at batch yakunida aniq qurilishi mumkin.
Amaliy ehtiyot choralari
Kod mustaqil ma’no anglatmaydi; uni tegishli lug‘atsiz o‘qib bo‘lmaydi. Fayl korruptsiyasi yoki noto‘g‘ri lug‘at versiyasi butun bo‘lakni noto‘g‘ri talqin qilishga olib keladi. Format kod oqimi va lug‘atni bir xil metadata chegarasi, nazorat summasi hamda versiya bilan bog‘laydi.
Taqsimlangan bajarishda turli row grouplarning kodlari bevosita taqqoslanmasligi mumkin. Dvigatel qiymatlarni dekodlaydi, lug‘atlar orasida moslik jadvali quradi yoki global identifikatorga o‘tkazadi. Eng yaxshi natija ustun cardinalitysi, qiymat uzunligi, lug‘atni yuklash xarajati va real so‘rovlar bilan o‘lchanadi.
Saralash bilan bog‘liqlik
Ma’lumot oldindan kategoriya bo‘yicha saralansa, bir xil kodlar uzun ketma-ketlik hosil qiladi va run-length encoding yaxshi ishlaydi. Biroq saralash boshqa muhim ustunning min–max pruning imkonini kamaytirishi mumkin. Lug‘at kodining son tartibi matn kollatsiyasi bilan mos bo‘lmasa, code_a < code_b taqqoslashidan leksik natija chiqarib bo‘lmaydi. Format sort order va dictionary orderni alohida metadata bilan ifodalaydi.
Bog‘liq tushunchalar
Columnar storage, Cardinality, Run-length encoding, Bit packing, Data compression, Row group, Parquet