თანამედროვე მონაცემთა ბაზების მართვაში, განსაკუთრებით კი დროითი სერიების (time-series) დამუშავებისას, შენახვის ხარჯების ოპტიმიზაცია კრიტიკული გამოწვევაა. TimescaleDB ამ პრობლემას ინოვაციური მიდგომით — Hypercore-ის ძრავით წყვეტს, რაც საშუალებას იძლევა, მონაცემები 98%-მდე შევკუმშოთ.

FeatureTOAST (vanilla PostgreSQL)TimescaleDB hypercore
Design goalIndividual values > 2 KBCross-row patterns in time-series
TriggerRow exceeds TOAST_TUPLE_THRESHOLD (~2 KB)Per-chunk policy (e.g. older than 7 days)
Supported typesVariable-length only (text, jsonb, bytea, numeric)All data types
Algorithmspglz (default), lz4 (since PG14, opt-in)Combination: delta encoding, delta-of-delta, simple-8b, run-length encoding, XOR-based, dictionary compression
Compression granularityPer value (1 value = 1 byte stream)Per batch (~1000 rows together)
Exploiting data structureNo - treats values as opaque bytesYes - exploits numeric structure, monotonicity, repetition
Typical ratio for sensor floats~1.0× (no compression)10-20×
Typical ratio for timestamps~1.0× (no compression - fixed-length type)50-100× (delta-of-delta for regular intervals)
Typical ratio for text2-3× (general-purpose LZ)5-10× (dictionary + RLE if repetitive)

ტრადიციული PostgreSQL-ის TOAST მექანიზმისგან განსხვავებით, რომელიც ცალკეულ დიდ მნიშვნელობებს ამუშავებს, TimescaleDB-ის შეკუმშვა მთლიანად მწკრივებს შორის არსებულ შაბლონებზეა ორიენტირებული. ეს ორი მექანიზმი ერთმანეთს ავსებს და არა ანაცვლებს.

timemachine_idsensor_typevalue
12:00:00MACHINE_001temp72.5
12:00:00MACHINE_001speed2.0
12:00:05MACHINE_001temp72.7
12:00:05MACHINE_001speed2.1
12:00:10MACHINE_001temp72.4
12:00:10MACHINE_001speed2.4
timemachine_idsensor_typevalue
12:00:00MACHINE_001temp72.5
0 secondsMACHINE_001speed2.0
5 secondsMACHINE_001temp+0.2
0 secondsMACHINE_001speed+0.1
5 secondsMACHINE_001temp-0.3
0 secondsMACHINE_001speed+0.3
timemachine_idsensor_typevalue
12:00:00MACHINE_001temp72.5
+5 secondsMACHINE_001temp+0.2
0 secondsMACHINE_001temp-0.3
0 secondsMACHINE_001temp+0.3
0 secondsMACHINE_001temp-0.1
timemachine_idsensor_typevalue
12:00:00MACHINE_001temp72.5
12:00:05MACHINE_001temp72.7
12:00:10MACHINE_001temp72.4
12:00:15MACHINE_001temp72.6
12:00:20MACHINE_001temp72.5
machine_idsensor_type
MACHINE_001 × 5temp × 5

Hypercore არის ჰიბრიდული მწკრივ-სვეტოვანი ძრავა. ახალი მონაცემები მასში ჩვეულებრივად, მწკრივებად ინახება, რაც სწრაფ ჩაწერას (INSERT/UPDATE) უზრუნველყოფს. თუმცა, დროთა განმავლობაში, სისტემა ავტომატურად გარდაქმნის მათ შეკუმშულ სვეტოვან ფორმატში.

columntechniquerepresentation after compression
timedelta-of-delta12:00:00, +5s, 0, 0, 0
machine_idrun-length encodingMACHINE_001 × 5
sensor_typerun-length encodingtemp × 5
valuedelta encoding72.5, +0.2, -0.3, +0.2, -0.1

როგორ მუშაობს შეკუმშვის ტექნოლოგია

კონვერტაციის პროცესში, 1000 მწკრივი ერთ ჯგუფად ერთიანდება. თითოეული სვეტი მასივად გარდაიქმნება, რაც ანალიტიკურ მოთხოვნებს საშუალებას აძლევს, მხოლოდ საჭირო ინფორმაცია წაიკითხოს და არა მთელი ცხრილი.

შეკუმშვისთვის გამოიყენება რამდენიმე სპეციალიზებული ალგორითმი:

  • Delta encoding: ინახავს მხოლოდ წინა მონაცემთან სხვაობას.
  • Delta-of-delta: იდეალურია მუდმივი ინტერვალების მქონე მონაცემებისთვის.
  • Gorilla XOR: ეფექტურია მცოცავი წერტილის მქონე რიცხვებისთვის.
  • Run-length encoding (RLE): იმეორებს ერთი და იმავე მნიშვნელობის მქონე მონაცემებს მხოლოდ ერთხელ.

მაგალითად, თუ სენსორი 10 წუთის განმავლობაში ერთსა და იმავე ტემპერატურას აჩვენებს, RLE მეთოდი ამ მონაცემს მინიმალურ სივრცეში ათავსებს.

სწორედ ამ მეთოდების კომბინაციით მიიღწევა მაღალი ეფექტურობა. თუმცა, მნიშვნელოვანია სწორი პარამეტრების არჩევა: segmentby განსაზღვრავს მონაცემთა დაჯგუფებას, ხოლო orderby — მათ თანმიმდევრობას შეკუმშვის პროცესში.

შედეგად, მოთხოვნები, რომლებიც იყენებენ ფილტრაციას segmentby სვეტის მიხედვით, შესაძლოა ათჯერ უფრო სწრაფად შესრულდეს. ეს არა მხოლოდ ზოგავს დისკის სივრცეს, არამედ ამცირებს ოპერატიული მეხსიერებისა და პროცესორის დატვირთვას.

უნდა გავითვალისწინოთ, რომ შეკუმშვა ყველაზე ეფექტურია მაშინ, როდესაც მონაცემთა სტრუქტურა რეგულარულია. თუ თქვენი სისტემა აგროვებს IoT მონაცემებს ან ფინანსურ ტრანზაქციებს, TimescaleDB-ის ეს ფუნქცია მნიშვნელოვნად შეამცირებს თქვენს ინფრასტრუქტურულ ხარჯებს.

MetricRowstore (chunk 47, 2.3 GB)Columnstore (chunk 46, 7.2 MB)
Execution time10.2 ms0.36 ms
Planning time19.0 ms1.9 ms
Total29.2 ms2.3 ms
Speed-up~12.7× total / 28× execution
Data compression ratio42.8× (308 MB → 7.2 MB)