Mobile-Menu

Speichertipp: In-Memory-Engine mit spaltenorientierter Architektur und Bitmap-Index für analytische Workloads in Go Column: spaltenorientierte Datenverarbeitung in Go

Von Thomas Joos 3 min Lesedauer

Anbieter zum Thema

Column organisiert Daten spaltenweise im Arbeitsspeicher, nutzt cachefreundliche SoA-Strukturen und Bitmap-Indizes für schnelle Filter und Projektionen. Transaktionen mit Commit und Rollback, sharded Latches sowie Zero-Allocation-Abfragen sichern das Tempo. TTL, Primärschlüssel, Change-Stream und Snapshot runden den Kern ab.

Column erlaubt Abfragen im Arbeitsspeicher ohne Allokationen.(Bild:  Midjourney / KI-generiert)
Column erlaubt Abfragen im Arbeitsspeicher ohne Allokationen.
(Bild: Midjourney / KI-generiert)

Column kombiniert spaltenorientierte Speicherung mit Bitmap-Indexierung, um Abfragen im Arbeitsspeicher ohne Allokationen auszuführen. Die Engine arbeitet vollständig in Go, liefert Transaktionen mit Isolation, unterstützt Aggregationen über SIMD und bietet ein durchdachtes Konzept für Snapshots, TTL und Änderungs-Streams.

Architektur und Datenspeicherung

Das System basiert auf einem strikt spaltenorientierten Layout nach dem Structure-of-Arrays-Prinzip. Jede Spalte wird als eigene Datenstruktur im Cache gehalten, wodurch sich Cache-Misses minimieren. Diese Organisation erlaubt schnelle Filtervorgänge über einzelne Spalten, da nur die tatsächlich relevanten Werte verarbeitet werden. Eine Bitmap-Indexierung ergänzt das Konzept. Sie bildet logische Abfragen über Bitoperationen ab und macht Filter wie AND, OR oder NOT zu Operationen im Speicher, die in Mikrosekunden ausgeführt werden.

Neue Datensätze entstehen in Collections, die über „NewCollection()“ angelegt werden. Spalten definiert der Entwickler mit Typfunktionen wie „ForString()“, „ForFloat64()“ oder „ForInt16()“. Ein einzelner Datensatz wird über „Insert()“ eingefügt, mehrere Datensätze werden effizienter innerhalb einer Transaktion eingefügt. Die Methode „Query()“ erzeugt dafür eine Transaktionsinstanz, auf der sich „Insert()“ mehrfach aufrufen lässt.

Abfragen, Indizes und Transaktionen

Filter entstehen durch „WithValue()“ oder durch vordefinierte Indizes. Häufige Prädikate lassen sich als Bitmap-Index anlegen, der bei jedem Insert oder Update automatisch neu bewertet wird. Eine Abfrage auf einen solchen Index mit „With("rogue")“ läuft um Größenordnungen schneller als ein Scan. Kombinierte Operationen wie „Union(), Without()“ oder logische Schnittmengen sind direkt implementiert und erlauben komplexe Auswahlbedingungen, ohne dass Zeilen erneut gescannt werden.

Jede Transaktion besitzt vollständige Isolation. Änderungen innerhalb einer Transaktion erscheinen erst nach „Commit()“, bei Fehlern erfolgt automatisch ein Rollback. Damit lassen sich mehrere Schreibvorgänge atomar zusammenfassen. Über Merge-Operationen können numerische oder stringbasierte Werte atomar aktualisiert werden, etwa um Kontostände zu inkrementieren oder Zeichenfolgen zu erweitern.

Sortierte Indizes und Iteration

Neben Bitmaps unterstützt Column auch sortierte Indizes. Diese werden in einer Transaktion temporär erstellt und erlauben geordnete Durchläufe über Teilmengen der Daten. Die Iteration über Ergebnislisten erfolgt über „Range()“. Vor dem Durchlauf werden Spaltenleser mit „txn.String()“ oder „txn.Float64()“ initialisiert, um Daten ohne Heap-Allokation auszulesen. Das Prinzip ermöglicht hochfrequente Lesezugriffe bei minimalem Speicherverbrauch.

Ablaufsteuerung und TTL

Ein internes Ablaufmanagement sorgt dafür, dass Datensätze mit Zeitbegrenzung automatisch entfernt werden. Jeder Collection liegt eine Spalte für Ablaufzeiten zugrunde. Beim Einfügen lässt sich über „SetTTL()“ eine Lebensdauer definieren, nach deren Ablauf die Zeile asynchron gelöscht wird. Diese Spalte kann auch aktiv erweitert werden, etwa durch eine Verlängerung per „Extend()“.

Primärschlüssel und binäre Datentypen

Neben dem internen Offset-Index unterstützt Column benutzerdefinierte Primärschlüssel über „ForKey()“. Abfragen erfolgen dann über „QueryKey()“, wodurch sich Datensätze direkt adressieren lassen. Für komplexe Strukturen existiert „ForRecord()“, das Objekte über „MarshalBinary()“ und „UnmarshalBinary()“ in Binärform speichert. Damit lassen sich strukturierte Datentypen wie Vektoren oder Koordinaten nativ in einer Spalte ablegen.

Streaming und Replikation

Die Engine bietet eine Change-Data-Stream-Schnittstelle, die alle Commits kontinuierlich überträgt. Ein Writer vom Typ commit.Channel empfängt Änderungen und kann diese an externe Systeme wie Kafka weitergeben oder direkt in eine zweite Instanz replizieren. Mit „Replay()“ lassen sich Transaktionen auf einer Ziel-Collection erneut anwenden, wodurch sich synchrone Kopien aufbauen lassen.

Snapshot und Wiederherstellung

Für persistente Sicherungen stehen „Snapshot()“ und „Restore()“ bereit. Beide Methoden arbeiten während laufender Transaktionen. Snapshots werden in eine Binärdatei geschrieben, die sich später wieder einlesen lässt. Da die Schema-Information nicht mitgespeichert wird, muss die Collection vor dem Restore mit identischer Spaltenstruktur initialisiert sein.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Data-Storage und -Management

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung

Leistung und Benchmarks

In Benchmarks mit 100.000 Datensätzen und zwölf Spalten werden Einfügezeiten unter einer halben Millisekunde und Leseoperationen im zweistelligen Nanosekundenbereich erreicht. Selbst bei 20 Millionen Zeilen liegen Scans im Millisekundenbereich, während indizierte Abfragen im Mikrosekundenbereich bleiben. Die Engine erreicht damit ein Leistungsprofil, das sich mit spezialisierten Analytics-Systemen messen kann.

Aktuelles eBook

Open-Source-Storage – Speicher-Software zum Nulltarif

eBook Open-Source-Storage
eBook „Open-Source-Storage“
(Bild: Storage-Insider)

Der Bedarf an Speicherkapazität steigt von Tag zu Tag – nicht nur, um die Daten von Produkten, Kunden und Transaktionen zu sichern, sondern auch, um Compliance-Anforderungen zu erfüllen und Auditierungen gut zu überstehen. Eine leistungsfähige Storage-Lösung ist also gefragt. Eine kostenlose Option bietet Open-Source-Software für Storage, insbesondere dann, wenn man sie selbst den eigenen Anforderungen anpassen darf.

Die Themen im Überblick:

  • Warum Storage als Open Source?
  • NAS & Objektspeicher
  • Backup & Disaster Recovery
  • Dateisysteme
  • Technologiestapel & Ökosysteme

(ID:50638746)