SECHZEHN MILLIONEN KONTAKTE,
SECHZEHN MEGABYTE BROWSER.
Excel endet bei 1.048.576 Zeilen. HubSpots Standardgrenze liegt bei fünfzehn Millionen Datensätzen je Objekt. Diese Woche haben wir sechzehn Millionen auf einer Zwei-Kern-Maschine gefahren — und zwei Dinge sind dabei kaputtgegangen, was die nützlichere Hälfte dieses Beitrags ist.

Irgendwo zwischen vierzigtausend und zweihunderttausend Datensätzen passiert etwas Vertrautes. Excel öffnet die Datei noch, aber sie ist kein Ort mehr, an dem man denken kann. Das CRM hält dieselben Daten anstandslos und zeigt Ihnen einen Bildschirm mit vierzig Zeilen davon. Keines von beiden ist kaputt. Beide haben nur still aufgehört, für das nützlich zu sein, was Sie eigentlich vorhatten: alles auf einmal anzusehen und einen Teil davon zu ändern.
Für diese Lücke ist die Podma Workbench gebaut. Diese Woche ist sie über den Punkt hinausgegangen, an dem aus der Lücke sonst eine Diskussion darüber wird, welches Werkzeug man kauft. Jede Zahl unten führt auf die Benchmark-Seite, wo sie mit der Maschine steht, auf der sie lief.
Wo eine Tabelle aufgibt.
Im Browser hält die Engine ein CRM-förmiges Blatt an der exakten Excel-Grenze: 1.048.575 Zeilen, 12,6 Millionen Zellen. Es lädt in 9,0 Sekunden, sortiert nach einer Textspalte in 4,1 Sekunden, filtert über zwei Bedingungen in 0,14 Sekunden, und eine einzelne Änderung bleibt im 95. Perzentil bei 0,1 ms — unabhängig davon, wie groß das Blatt ist. Auf einem Zwei-Kern-Container mit 7 GB Arbeitsspeicher. Der Entwickler-Laptop ist nicht nennenswert schneller, und das ist die interessantere Hälfte dieses Satzes.
Damit endet, was ein Browser halten kann, und genau dort hören die meisten Werkzeuge auf und geben Ihnen eine Seitenblätterung. Jenseits dieses Punktes verhält sich ein CMP42-Blatt weiter wie ein Blatt — und davon handelt der nächste Abschnitt.
Sechzehn Millionen, und der Browser merkt es kaum.
Bei 16.000.000 Kontakten — jenseits von HubSpots dokumentierter Grenze von fünfzehn Millionen Datensätzen je Objekt — sind die ersten Zeilen in 10 ms da, und der Sprung zum allerletzten Datensatz dauert 7 ms. Der Sprung in die Mitte einer sortierten Ansicht kostet 15 ms. Einen Bildschirm zu scrollen kostet ungefähr so viel wie ein Sprung über sechzehn Millionen Zeilen.
In einem echten Browser, nicht im Selbstgespräch des Servers: Das Blatt öffnete in 1,3 Sekunden, die Ende-Taste erreichte Datensatz 16.000.000 in 312 ms, und zweihundert Seitensprünge samt Sprung auf Datensatz acht Millionen dauerten 1,6 Sekunden. Der JavaScript-Speicher pendelte sich bei rund 16 MB ein.
Zum Vergleich: 793 MB kostet eine einzige Million Zeilen, wenn der Browser das ganze Blatt trägt. Das ist die Zahl, die wir an die Wand hängen würden — und nicht, weil sie für sich genommen beeindruckt: Sie bedeutet, dass das Werkzeug nicht schwerer wird, während das Geschäft wächst. Der Laptop der Kollegin, die am längsten dabei ist, arbeitet so gut wie der, der gestern kam.
Was über jeden Datensatz rechnet, ist die andere Hälfte der Geschichte, und sie braucht echte Zeit. Ein vollständiger Sortierlauf über sechzehn Millionen nach Nachname dauert auf der kleinen Maschine 75 Sekunden, die Anzahl pro Land über alle 27 Sekunden. Das ist kein Mangel, das sind sechzehn Millionen Vergleiche auf zwei Kernen — und wir veröffentlichen es in denselben Tabellen wie die Millisekunden, denn eine Seite, die nur die schnelle Hälfte zeigt, ist ein Prospekt.
Und niemand wird versehentlich angeschrieben.
Die zweite Hälfte dieser Woche ist unspektakulärer und wichtiger. Eine Empfängerliste entsteht in Podma nicht von Hand. Sie entsteht ausschließlich über den Versandschritt, und der prüft jeden einzelnen Datensatz gegen die Legende Ihres Kontos — den Grund, aus dem er kontaktiert werden darf, die Rechtsgrundlage, das Datum der Einwilligung, den letzten Kontakt.
Diese Prüfung läuft über jeden Datensatz, bei jeder Größe, nach demselben Maßstab. 2,1 Sekunden für eine Million, 38 Sekunden für sechzehn Millionen, auf der kleinen Maschine. Eine Liste fasst bis 100.000 Empfänger; verlangen Sie mehr, wird sie verweigert — und die Verweigerung wird als Ereignis ins Änderungsprotokoll geschrieben. Eine Verweigerung, die Sie nächstes Jahr vorzeigen können, ist mehr wert als eine, die bloß stattgefunden hat.
In dieser Größe hört das auf, hypothetisch zu sein. Allein eine Länder-Ansicht enthält über eine Million berechtigte Empfänger — deutlich über der Grenze —, der Schritt verweigert sie also wie entworfen und hält die Verweigerung fest. Eine ehrliche Abgrenzung gehört in denselben Atemzug: Die Prüfung liest Ihre Legende, sie ist keine Rechtsberatung und ersetzt weder Sperrlisten noch Opt-outs noch eine Kanal-mal-Land-Policy. Heute erzeugt sie eine Datei mit Protokolleintrag; channelSENDER versendet über die freigegebenen Listen1 — als erstes Modul auf Podma.
Eines war die Größe, eines ein Fehler. Beide sind weg.
Die Startseite konnte ein Konto dieser Größe nicht öffnen. Sie las zu viel auf einmal und hat den Server mitgenommen. Gefunden am Donnerstag, behoben am Donnerstag: Sie öffnet jetzt ein Konto mit sechzehn Millionen, in 8,4 Sekunden — und genau so viel kostet es, sechzehn Millionen Datensätze auf zwei virtuellen Kernen von der Platte zu zählen. Sie bei der Ankunft nicht mehr zu zählen, ist der nächste Schritt. Wir veröffentlichen die Zahl, weil sie die langsamste ist, die wir gemessen haben — nicht, weil sie schlecht ist.
Eine Compliance-Prüfung war ein echter Fehler. Eine gefilterte Ansicht darauf zu prüfen, wer kontaktiert werden darf, dauerte 84 Sekunden. Anders als beim Sortieren oder bei der Startseite war das nicht, was die Größe kostet: neunzehnmal langsamer bei viermal so vielen Daten, und dreimal schneller auf anderer Hardware. Diese Form sagt Defekt. Wir haben hier geschrieben, der Absatz bleibe, bis der Fehler gehe — er ist weg, und dieselbe Prüfung über 1.600.000 Kontakte dauert jetzt 10,5 Sekunden. Der Absatz bleibt in dieser Form stehen, damit Sie sehen, was er gesagt hat.
Alles hier ist Einzelnutzerbetrieb auf Entwicklungsmaschinen. Keine Produktion, keine gleichzeitige Last. Die Daten sind generiert — es wurden keine Kundendaten und keine personenbezogenen Daten verwendet oder gemessen. Und drei Dinge, die unterwegs sind, stehen auf der Benchmark-Seite als das, was CMP42 tut, mit Fußnote bis zum Release: eine Löschung, die den Audit-Trail erreicht; Aufbewahrung und Legal Hold als erzwungene Verweigerung statt als dokumentiertes Feld; und Mandantentrennung, die die Datenbank selbst durchsetzt.1
¹ Geplant für das nächste Release.
Headless geht schon heute.
Diese Woche hat ein Agent unser Objektmodell über MCP gelesen: sechs Objekttypen, zehn Beziehungsarten, jedes Feld typisiert und mit seiner Rechtsgrundlage. Keine Demo — ein Tool-Aufruf gegen einen laufenden Server, der die Registry als Daten zurückgibt.
Das ist kein zweites System neben dem ersten. Die Podma Workbench ist der Motor von CMP42, und sie hat zwei Eingänge: Ein Mensch öffnet die Workbench, ein Agent öffnet die MCP-Tools, und beide arbeiten an denselben Datensätzen über denselben geprüften Schreibpfad. Was ein Agent darf, ist arrangieren — Ansichten, Layout, was auf dem Schirm steht. Werte, Dateien und den Versandschritt schreibt die App. Diese Grenze steht im Code, nicht in einem Richtliniendokument.
Und das lohnt sich deutlich zu sagen. CMP42 ist ein Headless CRM. Die Datensätze, die Beziehungen und der rechtliche Zustand liegen im Graphen; die Workbench ist eine Oberfläche darauf, ein Agent eine zweite. Nichts an diesem Entwurf setzt ein CRM darunter voraus. Wer neu anfängt — oder wessen jetziges System längst nicht mehr passt — kann vom ersten Tag an auf dem Graphen arbeiten.
Wer nicht neu anfängt, muss nichts bewegen. Behalten Sie Ihr CRM, legen Sie die Workbench darüber und lassen Sie den Graphen von der Seite volllaufen. Beide Wege sind dasselbe Produkt; sie unterscheiden sich nur darin, wie viel Sie mitnehmen wollen — und wie ein Wechsel aussieht, ist eine Frage, die Sie später beantworten können.
Wir werden Ihnen nicht sagen, welcher von beiden Sie sind. Die ersten Design Partner finden es gerade heraus, und wir veröffentlichen, worauf sie stoßen — auch die Stellen, die nicht funktionieren.
→ Die vollständige Benchmark lesen, mit jeder Maschine und Methode.