Columnar — ma’lumotni rowlar bo‘yicha emas, columnlar bo‘yicha saqlash yoki qayta ishlash usuli. Columnar storage analitik querylarda faqat kerakli columnlarni o‘qish, kuchli compression va parallel processing imkonini beradi.
Bu yondashuv data warehouse, OLAP database, katta fayl formatlari va analytics tizimlarida keng qo‘llanadi.
Row-oriented storage
Row-oriented storage bitta recordning barcha fieldlarini yonma-yon saqlaydi.
Masalan:
id, name, region, amount, created_at
Bitta user yoki orderni to‘liq o‘qish tez.
OLTP tizimlarda insert, update va primary key lookup uchun qulay.
Column-oriented storage
Columnar model bir column qiymatlarini birga saqlaydi.
Soddalashtirilgan ko‘rinish:
id: 1, 2, 3, 4
region: UZ, UZ, KZ, UZ
amount: 10, 20, 15, 40
created_at: ...
Query faqat region va amountni ishlatsa boshqa columnlar diskdan o‘qilmasligi mumkin.
Column pruning
Queryga kerak bo‘lmagan columnlarni umuman o‘qimaslik column pruning deb ataladi.
Misol:
SELECT region, SUM(amount)
FROM sales
GROUP BY region;
name, description yoki boshqa katta fieldlar o‘qilmaydi.
Bu disk I/O va network sarfini kamaytiradi.
Compression
Bir column ichidagi qiymatlar bir xil type va ko‘pincha takroriy bo‘ladi.
Masalan, region columnida:
UZ, UZ, UZ, KZ, UZ
Compression usullari:
- dictionary encoding;
- run-length encoding;
- delta encoding;
- bit packing;
- frame-of-reference.
Columnar formatlar ko‘pincha row formatiga qaraganda yuqori compression beradi.
Dictionary encoding
Takroriy stringlar dictionary ID bilan almashtiriladi.
1 = UZ
2 = KZ
1, 1, 1, 2, 1
ko‘rinishida saqlanadi.
Bu storage va comparison xarajatini kamaytiradi.
Run-length encoding
Ketma-ket bir xil qiymatlar qiymat va son bilan saqlanadi.
UZ × 1000
KZ × 250
Sorted yoki group qilingan data’da samarali.
Tasodifiy qiymatlarda foydasi kamroq.
Delta encoding
Ketma-ket sonlar orasidagi farq saqlanadi.
Masalan:
1000, 1001, 1003, 1006
o‘rniga:
1000, +1, +2, +3
Timestamp va monoton IDlar uchun foydali.
Vectorized execution
Columnar engine bir qiymatni emas, qiymatlar batchini CPU instructionlari bilan qayta ishlaydi.
Amallar:
- filter;
- sum;
- comparison;
- aggregation;
- type conversion.
Bu branch va function call overheadini kamaytiradi.
SIMD instructionlar bir vaqtning o‘zida bir nechta qiymat ustida ishlashi mumkin.
Predicate pushdown
Filter storage qatlamiga yaqin joyda bajariladi.
Masalan:
WHERE region = 'UZ'
File yoki segment metadata’si UZ qiymati yo‘qligini ko‘rsatsa butun blok o‘qilmaydi.
Bu scan hajmini kamaytiradi.
Min-max metadata
Har block uchun minimum va maximum qiymat saqlanishi mumkin.
Agar query:
amount > 1000
bo‘lsa va block maximumi 500 bo‘lsa block skip qilinadi.
Bu zonemapga o‘xshash optimization.
Row group
Columnar fayl ko‘pincha row group’lardan iborat.
Har row group ichida columnlar alohida segment sifatida saqlanadi.
Juda katta row group:
- yaxshi compression;
- sekin random access.
Juda kichik row group:
- ko‘p metadata;
- yomon compression.
Batch load
Columnar storage ko‘pincha batch yoki append usulida yuklash uchun qulay.
Yangi data:
- memory batchga yig‘iladi;
- columnlarga ajratiladi;
- encode va compress qilinadi;
- immutable segmentga yoziladi.
Har bir kichik rowni alohida update qilish qimmat bo‘lishi mumkin.
Update va delete
Immutable column segmentlarda update yangi versiya yoki delta structure orqali bajarilishi mumkin.
Delete marker yoziladi, keyin background merge eski qiymatni olib tashlaydi.
Shu sababli columnar OLAP tizimlar ko‘pincha append-heavy workloadga mos.
Columnar file format
Columnar data file formatlarida:
metadata’si mavjud.
Bu distributed query engine’ga faqat kerakli qismlarni o‘qish imkonini beradi.
Data type
Column ichida bitta type bo‘lgani sabab engine qiymatni compact binary formatda saqlaydi.
String, integer, decimal va timestamp uchun alohida encoding ishlatiladi.
Noto‘g‘ri type, masalan sonni stringda saqlash, compression va query performance’ni yomonlashtiradi.
Analytical query
Columnar model quyidagi querylar uchun kuchli:
- katta scan;
- aggregation;
- group by;
- filter;
- percentile;
- report;
- dashboard.
Faqat bitta rowning barcha 200 columnini o‘qish kerak bo‘lsa row-oriented storage qulayroq bo‘lishi mumkin.
Hybrid storage
Ayrim database’lar row va columnar modelni birlashtiradi.
Operational data row storage’da saqlanadi.
Eski yoki analytical data columnar segmentga ko‘chiriladi.
Bu HTAPga yaqin workloadlarni qo‘llashi mumkin.
Columnar va OLTP
Columnar storage OLTP uchun mutlaqo yaroqsiz degani emas.
Ba’zi engine’lar:
orqali kichik update’larni qo‘llaydi.
Biroq asosiy kuchi analytical scan hisoblanadi.
Late materialization
Filter va join uchun avval faqat kerakli key columnlar o‘qiladi.
Katta text yoki boshqa output columnlar esa qaysi rowlar kerakligi aniqlangandan keyin yuklanadi.
Bu late materialization deb ataladi va keraksiz data decode qilishni kamaytiradi.
Zone map
Har block uchun minimum, maximum va null statistikasi saqlanishi mumkin.
Query sharti block qiymat oralig‘iga umuman mos kelmasa engine uni o‘qimaydi.
Zone map alohida row indexi emas; u katta blocklarni skip qilish uchun yengil metadata hisoblanadi.
Bog‘liq tushunchalar
Columnar storage, Column pruning, Vectorized execution, Compression, Dictionary encoding, Predicate pushdown, Row group, OLAP, Data warehouse