Sütun və Sətir Əsaslı Bazalar

columnar_vs_row

Salam!

Bu postumuzda Sətir və Sütun əsaslı dataları saxlamaq və onların üstünlüklərindən danışacağıq.

Əlaqəli data bazalarında(RDBMS) data-nı saxlamağın iki yolu vardır:

  • Sətir əsaslı
  • Sütun əsaslı (C-store olaraq da bilinir)

Sətir əsaslı bazalar, dataları rekord-a(record) görə tənzimləyən, bir sətirlə bağlı bütün dataları prossess etdiyi zaman yaddaşda yan yana tutan bazalardır. Sətir əsaslı bazalar, dataları düzgün şəkildə saxlamağın ənənəvi üsuludur və dataları özündə sürətli bir şəkildə saxlamaq üçün bəzi önəmli avantajları vardır. Sətirləri daha effektiv bir şəkildə oxumaq və yazmaq üçün optimizasiya edilmişdir.

Sətir əsaslı bazalara misal olaraq:

  • Postgres
  • MySQL
  • Oracle 

Sütun əsaslı bazalar, dataları xüsusi sahələrə(fields) görə tənzimləyən, bir field-ə bağlı bütün dataları prossess etdiyi zaman yaddaşda yan yana tutan bazalardır. Sütun əsaslı bazaların  populyarlığı günü gündən artır və dataları analiz etmək üçün performans üzrə üstünlükləri , yeni istifadə ortamları meydana çıxır. Sütunları daha effektiv bir şəkildə oxumaq və hesablamaq üçün optimizasiya edilmişdir.

Sütun əsaslı bazalara misal olaraq:

  • Redshift
  • BigQuery
  • Snowflake

Sətir əsaslı bazalar:

Dataları saxlamaq üçün ənənəvi RDBMs-lərdən(Relational Database Management Systems) ibarətdir. Tək bir sətirlik datanı oxumaq və yazmaq üçün optimizasiya edilmişlərdir.

Sətir əsaslı bazada datalar Sətir Sətir saxlanılır, belə ki bir Sətirin ilk sütunu, öncəki Sətirin son sütununun yanında olacaqdır.

Məsələn belə bir strukturu nəzərə alaq.

namecityage
AliBaku25
LelloBaku22
TeoLA24

Bu datalar, sətir əsaslı bir bazanın olduğu diskdə bu şəkildə Sətir Sətir sırayla saxlanılır:

AliBaku25LelloBakuTeoLA24

Sətir əsaslı bazada datalar necə əlavə edilir?

Hər bir datanın yeni bir sətir kimi bazaya əlavə olunması hər bir yeni datanın sürətli bir şəkildə bir rekord(record) kimi yazılmasına izin verir, çünki yeni datanı yazmaq üçün edilməsi gərək olan tək şey, mövcud dataların sonuna başqa bir Sətir əlavə etməkdir.

Məsələn: Bu sətiri əlavə etdikdə sətir əsaslı bir bazanın diskində bu cür saxlanılacaq.

Yeni sətir:

LeoVenice27

Diskdə yerləşməsi:

AliBaku25LelloBakuTeoLA24LeoVenice27

Gördüyünüz kimi yeni bir sətir kimi ən sona əlavə olundu.

Sətir əsaslı bazalar, data yazma prosessində performans olaraq daha yaxşı olduqları üçün OLTP tərzi application-lar üçün hələ də yayğın olaraq istifadə edilməkdədirlər. Bununla birlikdə, bu tip bazalar üçün başqa bir istifadə səbəbi isə saxladıqları datanı sürətli şəkildə analiz edə bilmək qabiliyyətidir hansı ki OLAP tipli bazalarda bu xüsusiyyətə çox büyük ehtiyac vardır. Məhz OLAP hissə Sətir əsaslı bazaların C-Store(sütün əsaslı) bazalardan daha yavaş olduğu hissədir.

Sətir əsaslı bazalardan data oxumaq.

Sətir əsaslı bazalar, bir Sətiri vəya bir neçə Sətirləri oxumaqda sürətlidir, ancaq bir aqreqasiya(aggregation) əməliyyatı etdiyimiz zaman, sadəcə toplamalı olduğu sütunlardan əlavə bütün mövcud sütunları da yaddaşa gətirir və bu səbəbdən data analitika zamanı yavaşdırlar. Əlavə olaraq, Sətir əsaslı bazalardan datanı götürmək üçün müraciət etdiyi disk sayı bir çox hallarda 1dən çoxdur və bu da özü özlüyündə bütün diskləri oxumağa vaxt sərf etdiyi anlamına gəlir.

Sətir əsaslı bazalar ümumi olaraq desək data prossesi zamanı yaddaşda əlavə məlumatlar toplayır.

Tutaq ki yukarıdaki cədvəlimizdən yaşların toplamını tapmaq istəyirik. Bunu edə bilmək üçün, bu 9 data parçasının(records) hamısını yaddaşa yükləməyimiz və ardından toplamanı həyata keçirmək üçün uygun dataları oxumağımız lazımdır. 

Sətir əsaslı bazalarda müraciət olunan disk sayı:

Fərz edək ki, bir Diskimiz hər diskdə saxlanacaq üç sütun üçün yalnız kifayət qədər bayt məlumat saxlaya bilər. Sətir əsaslı bazalarda qeyd olunan cədvəl aşağıdakı kimi saxlanılacaq:

Disk1

Disk2

Disk3

Üç ayrı diskdə üçlü qruplar halında saxlanılan doqquz rekord.

Bütün insanların yaşlarının toplamını əldə etmək üçün, baza üç diskin hər birinə və hər diskdəki üç sütuna baxmağı gərəkəcəkdir.

Beləcə, Sətir əsaslı bir bazaya data əlavə etmək sürətli və asan ikən, datanı buradan çıxarmaq, üzərində analiz aparmaq üçün əlavə olaraq yaddaş istifadə edilməsinin və birdən çox diskə müraciət edilməsi ehtiyacının yarandığını görəbilirik.

Sütun əsaslı bazalar:

Dataların daha sürətli analiz edilməsini dəstəkləmək məqsədilə bu tip bazalar yaradılmışdır. Bu tip bazalar sürətli oxumaq üçün optimizasiya edilmiştir.

C-Store, sütunlu vəya Sütun əsaslı bir data bazada, datalar bir sütunun hər Sətiri yeni sütundaki digər Sətirların yanında olacaq şəkildə saxlanılır.

Yuxarıdakı cədvələ  təkrar baxaq və sütun əsaslı bir bazada necə saxlanılacağını görək.

namecityage
AliBaku25
LelloBaku22
TeoLA24

Bu cədvəl sütün əsaslı bir bazada, Sətir Sətir sırayla her dəfəsində bir sütunda bucür saxlanılır:

AliLelloTeoBakuBakuLA252224

Sütun əsaslı data bazalara yazma:

Yeni bir sətir əlavə etmək istiyiriksə bu bazada bu cür formalaşacaq:

Yeni sətir:

LeoVenice27

Sütun əsaslı bazada necə saxlanılır:

Hər sütunu olması gərəkən yerdə saxlamq üçün datalar arasında gəzmək lazım gələcək 🙂

AliLelloTeoLeoBakuBakuLAVenice25222427

Məlumatlar bir diskdə saxlanılsaydı,  o zaman bütün datanı yaddaşa gətirməli olduğumuz üçün sətir əsaslı verilənlər bazası ilə eyni cür əlavə yaddaş probleminə sahib olardı sütun əsaslı bazalar. Bununla belə, sütun əsaslı verilənlər bazaları datanı ayrı disklərdə saxladıqda belə əhəmiyyətli üstünlüklərə malik olacaqdır. Necə?

Yuxarıdakı cədvəli eyni şəkildə məlumat diskinin üç sütununa yerləşdirsək, onlar belə saxlanılacaq:

Disk1

Disk2

Disk3

Sütun əsaslı bazadan Oxumaq:

Yaşların toplamını tapmaq üçün bu dəfə artıq yalnız 1 diskə müraciət etmək və içindəki bütün dəyərləri toplamaq kifayətdir. Sətir əsaslı bazalar kimi əlavə yaddaşa və bütün disklərə müraciət etmək gərəkmədi artıq.

Göstərdiyimiz bu misal çox sadə olsa da dataları sütunlara görə saxlamaq həm bazanın dataya müraciətinin sayını həm də datanın saxlanılacağı disklərin sayını azaldacağını eyni zamanda daha az yaddaş istifadə edəcəyini görə bilirik. Bununla da umumi olaraq baxdıqda bazanın sürətinə müsbət yöndə təsir edəcəkdir.

Sütun əaslı bir data bazadan daha çox performans əldə etmənin başqa yolları da vardır.

Dataları sıxlaşdırma(kompressleşdirmə):

Hər bir məlumat parçası(records) eyni sayda bit uzunluğundadırsa, bütün məlumatlar daha da sıxlaşdırıla bilərik ki, bu məlumat üçün məlumat parçalarının sayı vurulsun bit sayı qədər(records*bits) sıxlaşdırıla bilər.

Dataları sıralama:

Ad hoc sorğular yazarkən, performansı yaxşılaşdıracaq bir sıra müxtəlif növ data sıralamaları vardı. Məsələn, həm artan(ascending), həm də azalan(descending)  tarixə görə məlumatları almaq istəyə bilərik. Tək bir müştəri haqqında bütün məlumatları almaq istədikdə bu halda müştəriyə görə sıralama etmək performansı artıra bilər.

Sətir əsaslı bazalarda indekslər yaradıla bilər ancaq məlumatlar bu indekslərdə nadirən birdən çok sıralama(order) formasında saxlanılır. Bununla birlikdə, Sütun əsaslı bazalarda, dataları istədiyiniz sayıda və fərqli sıralama formasında saxlaya bilərsiniz. Sorgu performansında bunun fərqini görəcəksiniz. Bu müxtəlif sıralanmış sütunlara proqnozlar(projections) deyilir və məlumatlar bir neçə dəfə saxlandığı üçün sistemin daha çox xətaya dözümlü(fault tolerant) olmasına imkan verir.

Qısaca olaraq :

Sütun əsaslı verilənlər bazaları Redshift, BigQuery və Snowflake-in üzərində qurulduğu dizaynı izah edən 2005-ci ildə məqalə üzə çıxdı. Buna görə də  hamısı təxminən eyni performansa və xərclərə malikdir. Bu sütun əsaslı verilənlər bazalar bulud məlumat anbarlarının(Cloud Data Warehouse) əksər provayderləri tərəfindən istifadə olunur. Artıq bu bazalar OLAP-ı dəstəkləmək üçün əlaqəli verilənlər bazalarında dominant arxitekturaya çevrilib.