Bosh sahifa Wiki Columnar

Columnar

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

Column:

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:

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:

Batch load

Columnar storage ko‘pincha batch yoki append usulida yuklash uchun qulay.

Yangi data:

  1. memory batchga yig‘iladi;
  2. columnlarga ajratiladi;
  3. encode va compress qilinadi;
  4. 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:

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