[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"tool-pgvector-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":21,"sources":27,"cover":42,"og":43,"expertise":44,"locales":45,"lang":47,"title":49,"description":50,"coverAlt":51,"url":23,"pricing":52,"kind":53,"metaTitle":54,"takeaways":55,"faq":61,"toc":74,"blocks":99,"others":493},"pgvector","2026-09-21",10,"rag",[9,10,11,12,13],"Vector search","Postgres","HNSW","RAG","Quantisation",[4,15,16,17,18,19,20],"pgvector vs qdrant","postgres vector search","hnsw index postgres","iterative index scans","binary quantization postgres","vector database postgres",[22,24],{"name":4,"url":23},"https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector",{"name":25,"url":26},"PostgreSQL","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPostgreSQL",[28,30,33,36,39],{"title":29,"url":23},"pgvector README",{"title":31,"url":32},"pgvector changelog","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u002Fblob\u002Fmaster\u002FCHANGELOG.md",{"title":34,"url":35},"PostgreSQL news: pgvector 0.8.2 released","https:\u002F\u002Fwww.postgresql.org\u002Fabout\u002Fnews\u002Fpgvector-082-released-3245\u002F",{"title":37,"url":38},"AWS: Scale pgvector with binary quantization","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdatabase\u002Fscale-pgvector-with-binary-quantization-on-amazon-aurora-postgresql\u002F",{"title":40,"url":41},"pgvector licence","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u002Fblob\u002Fmaster\u002FLICENSE","\u002Fimages\u002Fblog\u002Fpgvector\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpgvector\u002Fog.jpg","ai-engineer",[46,47,48],"en","de","hu","pgvector im Review: die Vektordatenbank, die du nicht betreiben musst","Ein Review von pgvector 0.8.7: iterative Index-Scans für gefilterte Suche, HNSW und IVFFlat, Binärquantisierung bei 100 Millionen Vektoren und das CVE im Indexaufbau.","Eine Anfrage teilt sich oben in einen exakten Sequenzscan, einen HNSW-Graphlauf und eine IVFFlat-Sonde; ein Band unten zeigt einen iterativen Scan, der weiterläuft, bis die LIMIT-Zahl erreicht ist.","PostgreSQL licence","Vector database extension","pgvector: Vektorsuche in Postgres · Balázs Csorba",[56,57,58,59,60],"pgvector ist eine PostgreSQL-Erweiterung unter der PostgreSQL-Lizenz, Vektoren liegen also in normalen Tabellen, und Mandantenfilter, JOINs und kaskadierende Löschungen bleiben transaktionell.","Iterative Index-Scans, eingeführt in 0.8.0, sind die Lösung für gefilterte Suche: ohne sie liefert ein Filter, der 10 % der Zeilen trifft, bei Standard ef_search 40 etwa vier Zeilen.","AWS maß einen 367 GB großen HNSW-Index für 100 Millionen Vektoren mit 768 Dimensionen gegen einen 38 GB großen binärquantisierten Index, der in 1,1 statt 16,1 Stunden entstand.","CVE-2026-3172, behoben in 0.8.2 im Februar 2026, war ein Pufferüberlauf beim parallelen HNSW-Indexaufbau, der Daten anderer Relationen leaken konnte; der Fix braucht keinen Reindex.","Die Grenze ist Speicher, nicht die API: Passt der Index nicht mehr in shared_buffers, bleiben halfvec, Binärquantisierung, Partitionierung oder ein zweites System.",[62,65,68,71],{"q":63,"a":64},"Ist pgvector kostenlos nutzbar?","Ja. Es steht unter der PostgreSQL-Lizenz, ohne Gebühr, ohne Open-Core-Split und ohne Bezahltarif, und wird von einer wachsenden Zahl gehosteter Postgres-Anbieter vorinstalliert. Wichtig ist die gelieferte Version: Für iterative Index-Scans braucht es 0.8.0 oder neuer.",{"q":66,"a":67},"Wann HNSW statt IVFFlat verwenden?","HNSW liefert das bessere Verhältnis aus Tempo und Recall, kann auf einer leeren Tabelle angelegt werden, weil es keinen Trainingsschritt braucht, ist aber langsamer zu bauen und speicherhungriger. IVFFlat baut schneller und braucht zuerst Daten; das README empfiehlt lists = rows \u002F 1000 bis einer Million Zeilen, darüber sqrt(rows), und probes beginnend bei sqrt(lists).",{"q":69,"a":70},"Funktioniert pgvector mit einer WHERE-Klausel?","Ja, aber bei einem approximativen Index läuft der Filter nach dem Index-Scan, eine selektive Bedingung kann also weniger Zeilen liefern als die LIMIT verlangt. Dokumentiert sind ein B-Tree auf der Filterspalte, iterative Index-Scans über hnsw.iterative_scan, Partial-Indizes pro Wert und List-Partitionierung bei vielen Ausprägungen.",{"q":72,"a":73},"Wie viele Vektoren verarbeitet pgvector?","Eine einzelne Tabelle ist durch die 32-TB-Grenze von PostgreSQL begrenzt und davon, wie viel Index in den Speicher passt; AWS maß 367 GB Index für 100 Millionen Vektoren mit 768 Dimensionen und empfiehlt Partitionierung ab Milliarden-Größen. Darüber hinaus verweist das README auf Replikate, Citus, PgDog oder List-Partitionierung statt auf eine eingebaute Shard-Ebene.",[75,78,81,84,87,90,93,96],{"id":76,"title":77},"what-it-is","Was es ist",{"id":79,"title":80},"how-it-works","Wie es funktioniert",{"id":82,"title":83},"filtered-search","Gefilterte Suche",{"id":85,"title":86},"getting-started","Erste Schritte",{"id":88,"title":89},"performance","Performance",{"id":91,"title":92},"where-it-shingles","Wo es hakt",{"id":94,"title":95},"verdict","Urteil",{"id":97,"title":98},"sources","Quellen",[100,104,107,110,113,186,187,198,207,218,219,222,256,271,272,275,277,284,298,299,302,354,357,363,389,390,393,437,443,444,447,463,469,470],{"type":101,"content":102},"paragraph",[103],"pgvector ist eine PostgreSQL-Erweiterung, die Vektoren in eine normale Tabelle legt und mit SQL durchsucht. Es ist keine Vektordatenbank mit angehängter Abfragesprache: Es ergänzt vier Spaltentypen, sechs Distanzoperatoren und zwei Indextypen zu einer Datenbank, die die meisten Teams ohnehin betreiben, unter der PostgreSQL-Lizenz, die so liberal ist, wie Lizenzierung wird. Die hier vertretene Position: Das ist der richtige Standard für nahezu jede Retrieval-Last bis zu einigen zehn Millionen Vektoren, und ein Team, das in dieser Größenordnung eine eigene Vektordatenbank aufbaut, kauft Betriebsaufwand statt Fähigkeit.",{"type":101,"content":105},[106],"Es konkurriert mit Qdrant, Weaviate, Chroma und den vollständig betreuten Vektordiensten, und mit jedem gehosteten Postgres, das die Erweiterung inzwischen mitbringt. Was es eliminiert, ist eine ganze Klasse Infrastruktur: kein zweiter Dienst, kein zweites Protokoll zu authentifizieren, kein zweiter Backup-Zeitplan, keine Konsistenzlücke zwischen den Zeilen und den Embeddings, die sie beschreiben. Was bleibt, sind alle Postgres-Grenzen: einer Node Speicher, ein Vacuum, ein Schreibdurchsatz. Und genau die werden zu Designparametern, sobald der Index nicht mehr in den RAM passt.",{"type":108,"level":109,"id":76,"text":77},"heading",2,{"type":101,"content":111},[112],"Die erste Version 0.1.0 erschien am 20. April 2021, die aktuelle Version 0.8.7 am 1. Oktober 2026; im Repository waren zum Prüfzeitpunkt 23.300 Sterne und 1.300 Forks verzeichnet. Unterstützt werden PostgreSQL 13 und neuer; ausgeliefert als Docker-Image, über PGXN, APT, Yum, Homebrew und conda-forge, und vorinstalliert bei einer wachsenden Liste gehosteter Anbieter. Das ist relevant, weil ein betreuter Anbieter auf alter Version der häufigste Weg ist, auf dem ein Team meint, einen Sicherheitsfix zu haben, den es nicht hat.",{"type":114,"ordered":115,"items":116},"list",false,[117,124,130,149,158,184],[118,119,123],"Lizenz: ",{"tag":120,"children":121},"strong",[122],"die PostgreSQL-Lizenz",", derselbe liberale Text, den PostgreSQL selbst verwendet. Kein Open Core, keine kommerzielle Stufe, keine Funktion hinter einem Bezahltarif.",[125,126,129],"Version 0.8.7 vom 1. Oktober 2026; die 0.8-Reihe kennt ",{"tag":120,"children":127},[128],"iterative Index-Scans"," seit 0.8.0 im Oktober 2024, und genau diese Funktion hat gefilterte Suche berechenbar gemacht.",[131,132,136,137,140,141,144,145,148],"Vier Typen: ",{"tag":133,"children":134},"code",[135],"vector"," mit 4 Byte pro Dimension, ",{"tag":133,"children":138},[139],"halfvec"," mit 2, ",{"tag":133,"children":142},[143],"bit"," mit einem Bit pro Dimension und ",{"tag":133,"children":146},[147],"sparsevec"," für dünne Vektoren mit bis zu 1.000 nicht null Elementen.",[150,151,153,154,157],"Zwei Indextypen: ",{"tag":120,"children":152},[11]," für das beste Verhältnis aus Tempo und Recall, ohne Trainingsschritt, ",{"tag":120,"children":155},[156],"IVFFlat"," für schnellere Indexaufbauten und weniger Speicherbedarf.",[159,160,163,164,167,168,171,172,175,176,179,180,183],"Sechs Operatoren, die direkt in ORDER BY stehen können: L2 (",{"tag":133,"children":161},[162],"\u003C->","), Inneres Produkt (",{"tag":133,"children":165},[166],"\u003C#>","), Kosinus (",{"tag":133,"children":169},[170],"\u003C=>","), L1 (",{"tag":133,"children":173},[174],"\u003C+>","), Hamming (",{"tag":133,"children":177},[178],"\u003C~>",") und Jaccard (",{"tag":133,"children":181},[182],"\u003C%>",").",[185],"Speicherung und Zugriff kommen von Postgres selbst: ACID, Replikation über WAL, Point-in-Time-Recovery, JOINs und Row-Level-Security in derselben Tabelle wie die Embeddings.",{"type":108,"level":109,"id":79,"text":80},{"type":101,"content":188},[189,190,193,194,197],"Ohne Index ist eine Vektoranfrage ein Sequenzscan mit ORDER BY über die Distanzfunktion: exakte Ergebnisse, perfekter Recall, Kosten proportional zur Tabelle. Ein approximativer Index ändert diesen Pakt. HNSW baut über den Vektoren einen mehrschichtigen Graphen und läuft ihn ab und tauscht etwas Recall gegen Kosten, die nicht mehr mit der Tabelle wachsen; IVFFlat gruppiert Vektoren in Listen und befragt einen Teil davon. Das entscheidende Detail: Der Planner greift nur dann auf einen Index zu, wenn die Anfrage so aussieht wie ",{"tag":133,"children":191},[192],"ORDER BY embedding \u003C=> $1 LIMIT n",". Dieselbe Anfrage als ",{"tag":133,"children":195},[196],"ORDER BY 1 - (embedding \u003C=> $1) DESC"," notiert verwendet laut README keinen Index.",{"type":199,"attrs":200,"inner":204,"caption":205},"diagram",{"viewBox":201,"role":202,"aria-labelledby":203},"0 0 720 376","img","pgv-t pgv-d","\u003Ctitle id=\"pgv-t\">Drei Ausführungspfade für eine Vektoranfrage\u003C\u002Ftitle>\u003Cdesc id=\"pgv-d\">Eine Anfrage mit ORDER BY über einen Distanzoperator und LIMIT teilt sich oben in drei Wege. Links, kein Index: ein Sequenzscan mit perfekter Recall, dessen Kosten mit jeder Zeile wachsen. Mitte, HNSW: ein Lauf über einen mehrschichtigen Graphen mit m = 16 und ef_search = 40 als Standard, wobei jede WHERE-Klausel erst nach dem Index-Scan auf die Kandidaten angewendet wird. Rechts, IVFFlat: Vektoren in Listen gruppiert, nur die nächstgelegenen Listen werden abgefragt, gebaut nach dem Laden und über ivfflat.probes justiert, mit schlechterem Speed-Recall-Verhältnis. Ein Band unten: iterative Index-Scans, eingeführt in 0.8.0, laufen weiter, solange die Filter Zeilen verwerfen, in strict_order oder relaxed_order, begrenzt durch hnsw.max_scan_tuples mit Standard 20.000.\u003C\u002Fdesc>\u003Ctext x=\"20\" y=\"26\" class=\"d-title\">One query, three execution paths\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"26\" text-anchor=\"end\" class=\"d-label\">the ORDER BY decides\u003C\u002Ftext>\u003Crect x=\"260\" y=\"44\" width=\"200\" height=\"50\" rx=\"10\" class=\"d-accent\"\u002F>\u003Ctext x=\"360\" y=\"66\" text-anchor=\"middle\" class=\"d-text\">Query\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"84\" text-anchor=\"middle\" class=\"d-small\">ORDER BY distance, LIMIT 10\u003C\u002Ftext>\u003Cpath d=\"M360 94 V112\" class=\"d-line\"\u002F>\u003Cpath d=\"M126 112 H594\" class=\"d-line\"\u002F>\u003Cpath d=\"M126 112 V124\" class=\"d-line\"\u002F>\u003Cpath d=\"M360 112 V124\" class=\"d-line\"\u002F>\u003Cpath d=\"M594 112 V124\" class=\"d-line\"\u002F>\u003Crect x=\"20\" y=\"124\" width=\"213\" height=\"140\" rx=\"10\" class=\"d-box\"\u002F>\u003Ctext x=\"126\" y=\"154\" text-anchor=\"middle\" class=\"d-text\">Exact scan\u003C\u002Ftext>\u003Ctext x=\"126\" y=\"182\" text-anchor=\"middle\" class=\"d-small\">sequential scan\u003C\u002Ftext>\u003Ctext x=\"126\" y=\"206\" text-anchor=\"middle\" class=\"d-small\">perfect recall\u003C\u002Ftext>\u003Ctext x=\"126\" y=\"230\" text-anchor=\"middle\" class=\"d-small\">cost grows per row\u003C\u002Ftext>\u003Ctext x=\"126\" y=\"254\" text-anchor=\"middle\" class=\"d-small\">no index needed\u003C\u002Ftext>\u003Crect x=\"253\" y=\"124\" width=\"214\" height=\"140\" rx=\"10\" class=\"d-sky\"\u002F>\u003Ctext x=\"360\" y=\"154\" text-anchor=\"middle\" class=\"d-text\">HNSW\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"182\" text-anchor=\"middle\" class=\"d-small\">multilayer graph walk\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"206\" text-anchor=\"middle\" class=\"d-small\">m = 16, ef_search = 40\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"230\" text-anchor=\"middle\" class=\"d-small\">filter runs after the scan\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"254\" text-anchor=\"middle\" class=\"d-small\">the default index\u003C\u002Ftext>\u003Crect x=\"486\" y=\"124\" width=\"213\" height=\"140\" rx=\"10\" class=\"d-gold\"\u002F>\u003Ctext x=\"592\" y=\"154\" text-anchor=\"middle\" class=\"d-text\">IVFFlat\u003C\u002Ftext>\u003Ctext x=\"592\" y=\"182\" text-anchor=\"middle\" class=\"d-small\">lists, then probes\u003C\u002Ftext>\u003Ctext x=\"592\" y=\"206\" text-anchor=\"middle\" class=\"d-small\">build it after the load\u003C\u002Ftext>\u003Ctext x=\"592\" y=\"230\" text-anchor=\"middle\" class=\"d-small\">tune ivfflat.probes\u003C\u002Ftext>\u003Ctext x=\"592\" y=\"254\" text-anchor=\"middle\" class=\"d-small\">faster build, less recall\u003C\u002Ftext>\u003Crect x=\"20\" y=\"284\" width=\"679\" height=\"76\" rx=\"10\" class=\"d-box d-dash\"\u002F>\u003Ctext x=\"40\" y=\"312\" class=\"d-text\">Iterative scan, added in 0.8.0\u003C\u002Ftext>\u003Ctext x=\"40\" y=\"336\" class=\"d-small\">the scan continues when the filter drops rows: strict_order keeps exact distance order\u003C\u002Ftext>\u003Ctext x=\"40\" y=\"356\" class=\"d-small\">relaxed_order trades order for recall; bounded by hnsw.max_scan_tuples, default 20,000\u003C\u002Ftext>",[206],"Der Filter greift erst, wenn derapproximative Index seine Arbeit getan hat. Deshalb widersprechen sich ein selektiver WHERE-Index und ein approximativer Index, bis der Scan fortdarf.",{"type":101,"content":208},[209,210,213,214,217],"Das zweite Detail ist, wo die ",{"tag":133,"children":211},[212],"WHERE","-Klausel greift. Ein approximativer Index erzeugt Kandidaten, und der Filter wird danach auf sie angewendet; Selektivität und Recall wirken also zusammen: bei ",{"tag":133,"children":215},[216],"hnsw.ef_search"," mit Standard 40 und einer Bedingung, die 10 % der Zeilen trifft, kommen etwa vier Zeilen zurück. Nichts ist kaputt, der Index hat die verworfenen Zeilen schlicht nie gesehen. Dieses Verhalten ist die häufigste Ursache für Meldungen, die Erweiterung liefere zu wenige Ergebnisse, und darauf gibt es eine dokumentierte Lösung statt eines Workarounds.",{"type":108,"level":109,"id":82,"text":83},{"type":101,"content":220},[221],"Filterung ist hier kein Nachgedanke, sondern ein Problem erster Klasse, und die Dokumentation arbeitet vier Schritte in der Reihenfolge ab, in der ein Reviewer sie testen würde. Welcher gilt, hängt davon ab, wie selektiv der Filter ist, wie viel Recall die Anwendung wirklich braucht und wie viele Ausprägungen der Filter hat: Eine Mandantennummer mit 50.000 Werten verhält sich nicht wie eine Landeskennung mit acht.",{"type":114,"ordered":115,"items":223},[224,230,240,254],[225,226,229],"Indexiere die Filter-Spalte zuerst mit einem einfachen ",{"tag":120,"children":227},[228],"B-Tree",". Trifft die Bedingung nur einen kleinen Anteil der Zeilen, liefert das exakte Nachbarn, ohne den approximativen Index anzusprechen, und das README nennt genau das als Ausgangspunkt.",[231,232,235,236,239],"Bleibt der Filter breit, schalte iterative Index-Scans mit ",{"tag":133,"children":233},[234],"SET hnsw.iterative_scan = relaxed_order"," ein: Der Graph wird so lange abgelaufen, bis die LIMIT voll ist, und ",{"tag":133,"children":237},[238],"strict_order"," steht bereit, wenn die Distanzreihenfolge exakt sein muss.",[241,242,245,246,249,250,253],"Begrenze die Arbeit. ",{"tag":133,"children":243},[244],"hnsw.max_scan_tuples"," hat Standard 20.000 und ",{"tag":133,"children":247},[248],"hnsw.scan_mem_multiplier"," ein Vielfaches von ",{"tag":133,"children":251},[252],"work_mem",", ein selektiver Filter wird also zu einem begrenzten Scan statt zu einem unendlichen.",[255],"Bei vielen Ausprägungen nutzt man Partial-Indizes pro Wert oder list-Partitionierung der Tabelle. Das README weist außerdem darauf hin, dass Mandanten, die sich einen approximativen Index teilen, sich gegenseitig den Recall beeinflussen, was ein Partitionierungs- und kein Tuning-Argument ist.",{"type":257,"variant":258,"title":259,"body":260},"callout","note","Recall ist die Metrik, die niemand misst",[261],[262,263,266,267,270],"Die Dokumentation empfiehlt selbst, dieselbe Anfrage in einer Transaktion mit ",{"tag":133,"children":264},[265],"enable_indexscan = off"," laufen zu lassen und das Ergebnis gegen die approximative Antwort zu halten. Teams stellen ",{"tag":133,"children":268},[269],"ef_search"," auf Latenz ein und lassen den Vergleich aus, und genau so wird ein Index, der zehn Zeilen liefert statt vier, als schnell bezeichnet.",{"type":108,"level":109,"id":85,"text":86},{"type":101,"content":273},[274],"Die gesamte Schnittstelle ist SQL, und genau das ist der Grund, ihr einen eigenen API-Restsystemen vorzuziehen. Der Ausschnitt unten hat die Form einer Produktionstabelle: eine Spalte mit fester Dimension, ein exakter Index auf den Filter, ein approximativer Index auf den Vektor und die eine Einstellung, die entscheidet, ob eine gefilterte Anfrage zu kurz ausfällt.",{"type":133,"code":276},"CREATE EXTENSION IF NOT EXISTS vector;\n\n-- The dimension is part of the type, so every row has to match it.\nCREATE TABLE chunks (\n  id         bigserial PRIMARY KEY,\n  tenant_id  text       NOT NULL,\n  embedding  vector(1536)\n);\n\n-- Exact index on the filter first: for a selective tenant it answers the\n-- whole query and the approximate index is never consulted.\nCREATE INDEX ON chunks (tenant_id);\n\n-- Bulk load with COPY, then build the approximate index on top of the data.\nCREATE INDEX ON chunks USING hnsw (embedding vector_cosine_ops)\n  WITH (m = 16, ef_construction = 64);\n\n-- A filter matching 10% of rows with ef_search = 40 returns about four rows,\n-- so the scan has to be allowed to continue past its first pass.\nSET hnsw.iterative_scan = relaxed_order;\nSET hnsw.ef_search = 100;\n\nSELECT id\nFROM chunks\nWHERE tenant_id = 'acme'\nORDER BY embedding \u003C=> (SELECT embedding FROM chunks WHERE id = 42)\nLIMIT 10;",{"type":101,"content":278},[279,280,283],"Drei Entscheidungen in diesem Ausschnitt sind verteidigenswert. Die Dimension ist Teil des Typs, eine Zeile eines anderen Embedding-Modells fällt also schon bei ",{"tag":133,"children":281},[282],"INSERT"," auf, nicht erst zur Laufzeit. Der approximative Index wird nach den Daten gebaut, denn ein HNSW-Graph über eine leere Tabelle hat nichts zu verlinken und müsste ohnehin neu gebaut werden. Und der Probe-Vektor kommt aus einem Subselect, der Form, die der Planner akzeptiert; dieselbe Anfrage mit einem Ausdruck im ORDER BY fällt ohne Warnung auf einen Sequenzscan zurück.",{"type":257,"variant":285,"title":286,"body":287},"warn","Pflegen, bevor du einen Index baust",[288],[289,290,293,294,297],"CVE-2026-3172, behoben in 0.8.2 am 25. Februar 2026, war ein Pufferüberlauf beim parallelen HNSW-Indexaufbau, der Daten anderer Relationen leaken oder den Server abstürzen konnte. Die Korrektur ist ein Erweiterungs-Update, ",{"tag":133,"children":291},[292],"ALTER EXTENSION pgvector UPDATE",", ohne Reindex; solange ein Upgrade nicht möglich ist, ist ",{"tag":133,"children":295},[296],"max_parallel_maintenance_workers = 0"," während des Aufbaus die dokumentierte Abhilfemaßnahme. Spätere Versionen behoben weitere Pufferüberläufe beim IVFFlat-Aufbau, in 0.8.6 und erneut in 0.8.7 vom 1. Oktober 2026. Die Version, die der betreute Anbieter tatsächlich ausliefert, lohnt sich also zu lesen statt zu unterstellen.",{"type":108,"level":109,"id":88,"text":89},{"type":101,"content":300},[301],"Speicher ist die gesamte Performance-Geschichte. Eine Vektorspalte kostet 4 Byte pro Dimension plus 8 Byte Kopfzeile, 1.536 Dimensionen sind also rund 6 KB pro Zeile, noch bevor ein Index existiert. Ein HNSW-Index voller Präzision über 100 Millionen Vektoren mit 768 Dimensionen maß AWS im Benchmark mit 367 GB, etwa 3,7 GB pro Million. Die alternativen Typen existieren, um genau diese Zahl anzugreifen.",{"type":303,"head":304,"rows":313},"table",[305,307,309,311],[306],"Typ",[308],"Byte pro Dimension",[310],"Indexierbare Grenze",[312],"Was es kostet",[314,324,334,344],[315,318,320,322],[316],{"tag":133,"children":317},[135],[319],"4",[321],"2.000 Dims",[323],"die Basis; exakte Suche darüber ist exakter Recall",[325,328,330,332],[326],{"tag":133,"children":327},[139],[329],"2",[331],"4.000 Dims",[333],"halb so großer Index, in AWS-Tests nahezu kein Recall-Verlust",[335,338,340,342],[336],{"tag":133,"children":337},[143],[339],"1\u002F8",[341],"64.000 Dims",[343],"Hamming über Vorzeichenbits, braucht Reranking für Recall",[345,348,350,352],[346],{"tag":133,"children":347},[147],[349],"8 pro non-zero",[351],"1.000 non-zero",[353],"dünne Embeddings, L2, Kosinus, inneres Produkt und L1",{"type":101,"content":355},[356],"AWS hat die klarsten öffentlichen Zahlen dazu veröffentlicht: VectorDBBench v0.3.4 bei top_k=100 auf Aurora PostgreSQL 18.4 mit pgvector 0.8.0. Bei LAION 100M mit 768 Dimensionen hielt ein r8g.4xlarge mit 128 GB einen 367 GB großen HNSW-Index voller Präzision, den es nicht im Cache behalten konnte: 3,4 Anfragen pro Sekunde kalt bei Parallelität 10, 3.336 warm, Recall 0,965, 16,1 Stunden Aufbauzeit. Binärquantisierung mit Reranking brachte den Index auf 38 GB und den Aufbau auf 1,1 Stunden, erreichte 13,5 kalte und 895 warme Anfragen pro Sekunde, und bezahlte das mit Recall: 0,931.",{"type":101,"content":358},[359,360,362],"Derselbe Benchmark enthält das Gegenbeispiel, weshalb seine Zahlen mit ihrer Methodik gelesen werden müssen. Bei Cohere 10M, dessen 768-dimensionale Embeddings in der Nähe von null clustern, brauchte Binärquantisierung ein Reranking von 3.000 Kandidaten für 0,93 Recall und brach auf 16 Anfragen pro Sekunde bei p99 1.640 ms ein, während HNSW voller Präzision auf einer 384-GB-Instanz 6.930 Anfragen pro Sekunde bei 0,952 Recall lieferte. Quantisierung hängt von der Verteilung ab: Recall auf den eigenen Embeddings validieren, oder ",{"tag":133,"children":361},[139]," nehmen und den Index halbieren, statt zu raten.",{"type":114,"ordered":115,"items":364},[365,371,381,387],[366,367,370],"Erhöhe ",{"tag":133,"children":368},[369],"maintenance_work_mem"," vor dem HNSW-Aufbau; Postgres meldet per Notice, sobald der Graph nicht mehr hineinpasst, und das README warnt davor, es bis zum Speichermangel des Servers anzuheben.",[372,373,376,377,380],"Laden mit ",{"tag":133,"children":374},[375],"COPY",", danach indexieren, und in Produktion ",{"tag":133,"children":378},[379],"CREATE INDEX CONCURRENTLY",", damit der Aufbau Schreibvorgänge nicht blockiert.",[382,383,386],"VACUUM auf einem HNSW-Index kann lange dauern; die dokumentierte Abkürzung ist zuerst ",{"tag":133,"children":384},[385],"REINDEX INDEX CONCURRENTLY",", danach VACUUM.",[388],"Horizontale Skalierung wird geliehen statt gebaut: Replikation und Point-in-Time-Recovery kommen aus dem WAL, und das README verweist für Sharding auf Citus, PgDog oder List-Partitionierung.",{"type":108,"level":109,"id":91,"text":92},{"type":101,"content":391},[392],"Die Schwächen sind strukturell, nicht unvollendet. Alles läuft auf einem Postgres-Node, Index, Heap und Buffer-Cache konkurrieren also um denselben Speicher, und ein Index, der nicht mehr hineinpasst, wird zuerst zum I\u002FO-Problem und erst danach zum Recall-Problem. Approximative Suche und selektive Filter streiten sich auch mit iterativen Scans, denn ein begrenzter Scan bleibt begrenzt. Vacuum und Indexpflege sind die Aufgaben dieser Datenbank statt fremder. Und eingebautes Sharding gibt es nicht: horizontale Skalierung bedeutet Replikate, Partitionierung oder eine Erweiterung.",{"type":303,"head":394,"rows":403},[395,397,399,401],[396],"Alternative",[398],"Betriebsform",[400],"Betriebsaufwand",[402],"Wo sie besser ist",[404,415,426],[405,409,411,413],[406],{"tag":120,"children":407},[408],"Qdrant",[410],"Ein eigener Rust-Server oder die Cloud des Herstellers",[412],"Noch ein Cluster zu patchen, sichern und absichern",[414],"Payload-Filterung und Quantisierung auf Recall bei Skala optimiert",[416,420,422,424],[417],{"tag":120,"children":418},[419],"Weaviate",[421],"Ein eigener Server mit GraphQL-API oder die Cloud des Herstellers",[423],"Dasselbe noch einmal, plus eigene Modulkonfiguration",[425],"Hybrid-Suche und Vektorisierung an einem Ort konfiguriert",[427,431,433,435],[428],{"tag":120,"children":429},[430],"Chroma",[432],"Eingebettet im Prozess oder als kleiner eigenständiger Server",[434],"Fast keiner, aber auch kein Postgres",[436],"Der kürzeste Weg vom Prototyp zum laufenden System",{"type":101,"content":438},[439,440,442],"Die ehrliche Grenze: pgvector gewinnt, solange die Vektoren eine Spalte der Daten sind, die das Team ohnehin speichert, und verliert, sobald eine Anfrage einen großen Graphen, einen gefilterten Scan und den Rest des Arbeitspeichers der Anwendung in denselben Speicher legen muss. AWS hat diese Grenze bei 367 GB Index für 100 Millionen Vektoren gemessen und sie mit Quantisierung und Partitionierung umgangen. Teams, die diesen Tausch nicht besitzen wollen, haben vier Auswege: ",{"tag":133,"children":441},[139],", Binärquantisierung mit Reranking, Partitionierung nach Mandant oder ein eigenes System, und die ersten beiden sind billig genug, bevor über das vierte gesprochen wird.",{"type":108,"level":109,"id":94,"text":95},{"type":101,"content":445},[446],"pgvector sollte die Standardantwort darauf sein, wohin die Embeddings gehören, für jedes Team, das bereits Postgres betreibt, und eine eigene Vektordatenbank sollte sich ihren Weg freistritten müssen. Die Erweiterung hat die ungewöhnliche Eigenschaft, dass ihre Fehlermodi die Fehlermodi einer Datenbank sind, die das Team bereits versteht: Speicherdruck, Wartungsfenster, Schreibdurchsatz eines Nodes. Wähle etwas anderes bewusst, mit einer benennbaren Skala oder einem benennbaren Latenzziel.",{"type":114,"ordered":448,"items":449},true,[450,452,454,456,461],[451],"Nimm pgvector, wenn die Vektoren Zeilen beschreiben, die das Team ohnehin speichert, und Mandantentrennung, kaskadierende Löschungen oder ein JOIN mit der Quelltabelle transaktionell sein müssen.",[453],"Nimm es, wenn der Bestand bis zu einigen zehn Millionen Vektoren umfasst und der Filter so selektiv ist, dass ein B-Tree auf der Filterspalte den Großteil der Anfrage trägt.",[455],"Nimm es, wenn die Alternative ein zweites Produktionssystem ist: Die Erweiterung erbt Backup, Replikation, Monitoring und Zugriffskontrolle, die es schon gibt, und fügt nichts Neues hinzu, was zu betreiben wäre.",[457,458,460],"Nimm es nicht, wenn eine einzelne Anfrage einen mehrere hundert Gigabyte großen Graphen plus den Arbeitspeicher der Anwendung halten muss, wenn nicht ",{"tag":133,"children":459},[139]," oder Binärquantisierung auf den echten Embeddings schon gemessen wurde.",[462],"Nimm es nicht, wenn der Anspruch dauerhafter Schreibdurchsatz über mehrere Nodes oder latenzarmer gefilterter Recall über mehrere hundert Millionen Vektoren ist; das ist Partitionierung oder ein eigenes System, und Aufschieben kostet später eine Migration.",{"type":464,"content":465},"quote",[466,467,468],"Nicht alle Embedding-Modelle erzeugen Vektoren, die sich gut quantisieren lassen. Vor der Entscheidung mit den eigenen Daten validieren."," ","— AWS Database Blog, 18. August 2026",{"type":108,"level":109,"id":97,"text":98},{"type":114,"ordered":448,"items":471},[472,477,481,485,489],[473],{"tag":474,"href":23,"children":475},"a",[476],"pgvector-README: Typen, Indexierung, Filterung und Skalierung",[478],{"tag":474,"href":32,"children":479},[480],"pgvector-Changelog, 0.1.0 bis 0.8.7",[482],{"tag":474,"href":35,"children":483},[484],"PostgreSQL-News: pgvector 0.8.2 erschienen (CVE-2026-3172)",[486],{"tag":474,"href":38,"children":487},[488],"AWS: pgvector mit Binärquantisierung auf Aurora PostgreSQL skalieren",[490],{"tag":474,"href":41,"children":491},[492],"pgvector-Lizenz: die PostgreSQL-Lizenz",[494,543,597,647],{"slug":495,"published":496,"minutes":497,"category":7,"tags":498,"keywords":503,"about":512,"sources":516,"cover":535,"og":536,"expertise":44,"locales":537,"lang":47,"title":538,"description":539,"coverAlt":540,"url":541,"pricing":542,"kind":499},"zep","2026-10-06",11,[499,500,501,502,12],"Agent memory","Knowledge graph","Temporal graph","Context engineering",[504,505,506,507,508,509,510,511],"zep ai","zep agent memory","graphiti knowledge graph","zep pricing","zep vs mem0","long-term memory for agents","temporal knowledge graph","zep cloud",[513],{"name":514,"url":515},"Zep","https:\u002F\u002Fwww.getzep.com\u002F",[517,520,523,526,529,532],{"title":518,"url":519},"Zep pricing: plans, credits and limits","https:\u002F\u002Fwww.getzep.com\u002Fpricing",{"title":521,"url":522},"Zep documentation","https:\u002F\u002Fhelp.getzep.com\u002F",{"title":524,"url":525},"Graphiti on GitHub","https:\u002F\u002Fgithub.com\u002Fgetzep\u002Fgraphiti",{"title":527,"url":528},"Graphiti product page","https:\u002F\u002Fwww.getzep.com\u002Fplatform\u002Fgraphiti\u002F",{"title":530,"url":531},"Announcing a new direction for Zep's open-source strategy","https:\u002F\u002Fwww.getzep.com\u002Fblog\u002Fannouncing-a-new-direction-for-zeps-open-source-strategy\u002F",{"title":533,"url":534},"Graphiti: temporal knowledge graphs for AI agents (arXiv)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.13956","\u002Fimages\u002Fblog\u002Fzep\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fzep\u002Fog.jpg",[46,47,48],"Zep-Review: Agenten-Memory auf einem temporalen Graphen","Zep ist eine gehostete Agenten-Memory-API auf einem temporalen Knowledge Graph: Credits beim Schreiben, Retrieval gratis, Flex ab 125 Dollar im Monat, Graphiti als selbst hostbarer Teil.","Diagramm, wie eine Aussage in Zep den Prompt erreicht: Nachrichten und Aussagen werden in einen benutzerspezifischen Context Graph aus Entitäten und Beziehungen extrahiert, und der Retrieval durchläuft den Graphen und liefert einen Kontextblock mit den tragenden Fakten.","https:\u002F\u002Fwww.getzep.com","Apache-2.0 core · Cloud from $50 per month",{"slug":544,"published":5,"minutes":545,"category":7,"tags":546,"keywords":549,"about":557,"sources":564,"cover":589,"og":590,"expertise":44,"locales":591,"lang":47,"title":592,"description":593,"coverAlt":594,"url":595,"pricing":596,"kind":559},"lancedb",9,[9,547,548,12],"Hybrid search","Embedded database",[544,550,551,552,553,554,555,556],"lancedb review","lance vector database","embedded vector database","lancedb vs qdrant","hybrid search rrf","lancedb indexing","lance data format",[558,561],{"name":559,"url":560},"Vector database","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVector_database",{"name":562,"url":563},"Apache Arrow","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FApache_Arrow",[565,568,571,574,577,580,583,586],{"title":566,"url":567},"LanceDB quickstart","https:\u002F\u002Fdocs.lancedb.com\u002Fquickstart",{"title":569,"url":570},"LanceDB vector indexes","https:\u002F\u002Fdocs.lancedb.com\u002Findexing\u002Fvector-index",{"title":572,"url":573},"LanceDB indexing guide","https:\u002F\u002Fdocs.lancedb.com\u002Findexing\u002Findex",{"title":575,"url":576},"LanceDB hybrid search","https:\u002F\u002Fdocs.lancedb.com\u002Fsearch\u002Fhybrid-search",{"title":578,"url":579},"LanceDB Enterprise","https:\u002F\u002Fdocs.lancedb.com\u002Fenterprise",{"title":581,"url":582},"LanceDB frequently asked questions","https:\u002F\u002Fdocs.lancedb.com\u002Ffaq\u002Ffaq-oss",{"title":584,"url":585},"LanceDB pricing","https:\u002F\u002Flancedb.com\u002Fpricing",{"title":587,"url":588},"LanceDB on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Flancedb\u002F","\u002Fimages\u002Fblog\u002Flancedb\u002Fcover.webp","\u002Fimages\u002Fblog\u002Flancedb\u002Fog.jpg",[46,47,48],"LanceDB: Vektorsuche, die als Bibliothek beginnt","Ein Test von LanceDB: eine Apache-2.0-Bibliothek statt Server, die IVF- und HNSW-Indexwahl, Hybridsuche mit Rangfusion und was Enterprise zusätzlich bringt.","Coverbild zum LanceDB-Test: eine Lance-Tabelle speist einen Vektorindex und einen Volltextindex in eine verschmolzene Rangliste","https:\u002F\u002Flancedb.com","Apache-2.0 · Cloud paid",{"slug":598,"published":599,"minutes":6,"category":7,"tags":600,"keywords":602,"about":608,"sources":612,"cover":640,"og":641,"expertise":44,"locales":642,"lang":47,"title":643,"description":644,"coverAlt":645,"url":611,"pricing":646,"kind":499},"mem0","2026-09-17",[499,601,12,9],"Long-term memory",[598,603,604,605,606,509,607],"mem0 review","agent memory layer","mem0 self-hosted","mem0 pricing","mem0 alternatives",[609],{"name":610,"url":611},"Mem0","https:\u002F\u002Fmem0.ai",[613,616,619,622,625,628,631,634,637],{"title":614,"url":615},"Mem0 documentation","https:\u002F\u002Fdocs.mem0.ai\u002Fintroduction",{"title":617,"url":618},"Mem0 quickstart","https:\u002F\u002Fdocs.mem0.ai\u002Fquickstart",{"title":620,"url":621},"How Mem0 works","https:\u002F\u002Fdocs.mem0.ai\u002Fcore-concepts\u002Fhow-it-works",{"title":623,"url":624},"Mem0 pricing","https:\u002F\u002Fmem0.ai\u002Fpricing",{"title":626,"url":627},"Mem0 on GitHub","https:\u002F\u002Fgithub.com\u002Fmem0ai\u002Fmem0",{"title":629,"url":630},"mem0ai on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fmem0ai\u002F",{"title":632,"url":633},"Mem0 research and benchmarks","https:\u002F\u002Fmem0.ai\u002Fresearch",{"title":635,"url":636},"Mem0 MCP server","https:\u002F\u002Fdocs.mem0.ai\u002Fplatform\u002Fmem0-mcp",{"title":638,"url":639},"Mem0 paper on arXiv","https:\u002F\u002Farxiv.org\u002Fabs\u002F2504.19413","\u002Fimages\u002Fblog\u002Fmem0\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmem0\u002Fog.jpg",[46,47,48],"Mem0: was eine Agent-Speicherschicht pro Runde kostet","Ein Review von Mem0: extrahierte Fakten pro Runde, die Benchmark-Tabelle vom April 2026 mit Plattform-Vorbehalt, vier Cloud-Stufen und die Lücken beim Self-Hosting.","Eine Schleife, die aus Gespräch gespeicherte Fakten macht und sie zurück in den Prompt liest","Free tier · from $19 per month",{"slug":648,"published":649,"minutes":6,"category":7,"tags":650,"keywords":653,"about":662,"sources":672,"cover":691,"og":692,"expertise":44,"locales":693,"lang":47,"title":694,"description":695,"coverAlt":696,"url":665,"pricing":697,"kind":559},"milvus-zilliz","2026-09-08",[9,547,651,652,12],"BM25 full text","Distributed",[654,655,656,657,658,659,660,661],"milvus","milvus vs qdrant","zilliz cloud pricing","vector database comparison","milvus hybrid search","apache milvus self-hosting","milvus 3.0","rag vector store",[663,666,669],{"name":664,"url":665},"Milvus","https:\u002F\u002Fmilvus.io",{"name":667,"url":668},"Zilliz Cloud","https:\u002F\u002Fzilliz.com",{"name":670,"url":671},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",[673,676,679,682,685,688],{"title":674,"url":675},"Milvus architecture overview","https:\u002F\u002Fmilvus.io\u002Fdocs\u002Farchitecture_overview.md",{"title":677,"url":678},"Milvus release notes","https:\u002F\u002Fmilvus.io\u002Fdocs\u002Frelease_notes.md",{"title":680,"url":681},"Milvus releases on GitHub","https:\u002F\u002Fgithub.com\u002Fmilvus-io\u002Fmilvus\u002Freleases",{"title":683,"url":684},"Milvus README: features and licence","https:\u002F\u002Fgithub.com\u002Fmilvus-io\u002Fmilvus",{"title":686,"url":687},"Zilliz Cloud pricing","https:\u002F\u002Fzilliz.com\u002Fpricing",{"title":689,"url":690},"Zilliz Cloud list price","https:\u002F\u002Fzilliz.com\u002Fpricing\u002Fpricing-guide","\u002Fimages\u002Fblog\u002Fmilvus-zilliz\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmilvus-zilliz\u002Fog.jpg",[46,47,48],"Milvus-Review: die vollständigste Vektordatenbank im Betrieb","Milvus 3.0.2 ist die vollständigste Open-Source-Vektordatenbank und die aufwendigste im Betrieb. Review von Architektur, Hybridsuche, Kosten und Einsatzgrenzen.","Covermotiv zum Milvus-Review: eine Pipeline von Ingest über Index, Suche und Reranking","Apache-2.0 · Zilliz Cloud free tier",1791383550540]