Bitmap-Native Analytical SQL
Status: Draft v0.1, internal working paper Last updated:
2026-07-19
This paper is an engineering narrative for QuantaStream. It is not a
legal analysis, patent claim chart, benchmark report, or final public
positioning document. Its job is to preserve the architectural thesis
while the engine is still moving quickly.
Executive Summary
QuantaStream is built around a simple idea:
Bitmap-native analytical SQL.
The database should accept familiar SQL, but the physical execution
model should avoid treating SQL as an instruction to eagerly assemble
rows. Instead, queries are lowered into constraints over compressed
bitmap domains. Filters, joins, semi-joins, anti-joins, grouping inputs,
and same-row comparisons become set operations over row-number domains,
bit-sliced indexes, dictionaries, and relationship vectors. Rows are
rehydrated only after the candidate sets have already been narrowed.
This is the core distinction: QuantaStream is not a row engine with
bitmap indexes bolted on. It is a bitmap-domain execution engine with a
SQL front end.
Motivation
Traditional relational engines are extraordinarily capable, but their
physical operators often revolve around moving, hashing, sorting, and
materializing tuples. Modern column stores improve locality and
compression, but many still pay substantial costs once a query shape
requires joins, correlated membership, subqueries, grouped aggregates,
or repeated domain translation between fact and dimension tables.
QuantaStream takes a different route. It tries to keep the query in
compressed set form for as long as possible:
AND becomes bitmap intersection.
OR becomes bitmap union.
NOT, anti-join, and NOT IN become bitmap
difference.
- Equality and range predicates over numeric, time, and encoded string
domains produce candidate bitmaps.
- Join relationships are represented as vectors that translate
candidate sets between row-number domains.
- Aggregation operates after candidate reduction, materializing only
the fields required for grouping, ordering, aggregate inputs, residual
predicates, and final projection.
The result is an execution model where SQL becomes constraint
propagation over compressed bitmap domains.
Core Vocabulary
QuantaStream needs crisp terms because bitmap engines and relational
databases use similar words differently.
rownum : The tuple identifier within a table. This is
the relational row identity used by the query engine. It is not the same
as a bitmap "row id" in legacy naming.
bitmap : A compressed set of rownums, usually
represented with Roaring bitmaps. A bitmap answers the question "which
rows are currently candidates?"
standard bitmap : A bitmap attached to a discrete value.
Low-cardinality enum values and boolean states naturally fit here.
multiplicity : The column cardinality model.
scalar means one logical value per row. set
means a row may belong to multiple value bitmaps for the same
column.
BSI : A bit-sliced index. A BSI represents numeric,
timestamp, or encoded string values in a way that supports equality,
range, comparison, and aggregate-like operations without first
rehydrating all original values.
StringEnum : A dictionary-backed low-cardinality string
representation. Values map to stable dictionary ids, and each id can be
represented as a standard bitmap.
backing string : A high-cardinality string
representation where the bitmap/BSI path carries a compact comparable
value and the original value is available through KVStore when
rehydration is needed.
relationship vector : A BSI that maps rownums in one
table domain to rownums in another table domain. In practice this is the
engine's native representation for parent-child relationships.
seed bitmap : A first-class existence/candidate bitmap
for a table or shard. A seed answers "what rows exist?" without
synthesizing the answer through a large number of independent predicate
fragments.
Data Representation
The core representation model is intentionally pluggable, but the
primitives are few:
- Low-cardinality strings and booleans are represented as standard
bitmaps.
- Numeric values are represented as numeric BSIs.
- Timestamps are represented as timestamp BSIs with an explicit
granularity.
- High-cardinality strings can be represented through compact BSI/hash
lookup plus backing storage.
- Relationship columns are represented as vector BSIs.
- Existence can be represented as a table or shard seed bitmap.
The goal is to reduce one-off physical types. A schema should
describe the semantics of a column and the data representation choices:
cardinality, multiplicity, time granularity, numeric precision, prefix
length, max length, searchability, dictionary behavior, and rehydration
policy.
That lets the planner reason about a column in terms of
capabilities:
- Can this column produce an equality bitmap?
- Can it produce a range bitmap?
- Can it participate in prefix matching?
- Can it perform same-row BSI comparisons?
- Does it require dictionary lookup for original values?
- Does it need KVStore rehydration?
- Can it be used as a relationship vector?
The optimizer should make decisions from capabilities, not from
historical type names.
Selection Algebra
A single-table predicate lowers into a bitmap expression:
where age >= 30 and status in ('ACTIVE', 'TRIAL')
becomes:
INTERSECT(
BSI_RANGE(age, 30, +inf),
UNION(
BITMAP(status = 'ACTIVE'),
BITMAP(status = 'TRIAL')
)
)
The result is a candidate rownum bitmap. No rows need to exist yet.
The engine can also represent !=, NOT IN, and
anti-membership as differences from a seed:
DIFFERENCE(
SEED(customers),
BITMAP(status = 'DELETED')
)
This is important because absence and negation are not afterthoughts.
They are native set operations.
Boolean Algebra
Boolean predicate lowering should preserve SQL semantics while
favoring bitmap algebra:
A AND B -> INTERSECT(A, B)
A OR B -> UNION(A, B)
NOT A -> DIFFERENCE(seed, A)
A AND NOT B -> DIFFERENCE(A, B)
The planner must respect parentheses, three-valued SQL semantics
where applicable, and NULL behavior. The physical target, however,
remains simple: produce candidate bitmaps and combine them with set
algebra.
This gives the optimizer a useful freedom: it can order selective
bitmap reductions before expensive residual scans, and it can avoid
materializing columns that only exist to reduce candidate sets.
BSI Algebra
BSIs extend bitmap selection beyond discrete value membership.
For a single BSI column:
- Equality produces a bitmap of rows whose encoded value equals a
literal.
- Range produces a bitmap of rows inside a lower/upper bound.
- Greater-than and less-than variants produce directional candidate
bitmaps.
- Batch equality can combine many equality probes into one membership
result.
For two BSI columns in the same rownum domain:
where l_receiptdate > l_commitdate
should become:
BSI_COMPARE_GT(l_receiptdate, l_commitdate)
That returns a bitmap directly. The important point is that same-row
field comparison should not require materializing both values for every
candidate row and comparing them in Go. That is temporary implementation
scaffolding, not the desired algebra.
This is one reason the Roaring BSI work matters. APIs such as
BSI-to-BSI comparison let QuantaStream express query intent at the
correct physical level.
Join Algebra
The join model is the heart of QuantaStream.
In a conventional relational execution plan, a join often constructs
joined tuples or a hash structure over one side and probes from the
other. In QuantaStream, the preferred physical operation is
relationship-vector constraint propagation.
This is the direct architectural descendant of the bitmap-join patent
work. The patent is not merely background IP; it is the foundation for
treating joins as vector-based translation between bitmap rownum domains
rather than tuple assembly. QuantaStream's relationship-vector execution
model is the modern engineering expression of that idea.
For a parent-child relationship:
orders.o_orderkey -> lineitem.l_orderkey
QuantaStream can store a relationship vector BSI:
lineitem rownum -> orders rownum
This gives the planner two directions of movement:
- Parent-to-child: apply an orders candidate set to the lineitem
relationship vector and produce matching lineitem rownums.
- Child-to-parent: transpose or reduce a lineitem candidate set
through the relationship vector and produce matching orders
rownums.
That means join execution can be viewed as repeatedly tightening
candidate sets for each table role:
candidates(customer) -> relationship vector -> candidates(orders)
candidates(orders) -> relationship vector -> candidates(lineitem)
candidates(lineitem) -> relationship vector -> candidates(orders)
Each table role keeps its own rownum domain. The planner must know
when a set crosses rownum domains, and it must translate explicitly
through a relationship vector. A bitmap from one table is never casually
compared to a bitmap from another table.
Semi-Joins and Anti-Joins
Semi-joins and anti-joins fall naturally out of bitmap algebra.
EXISTS is membership:
outer candidates INTERSECT rows_with_matching_inner
NOT EXISTS is difference:
outer candidates DIFFERENCE rows_with_matching_inner
This is strategically important. SQL subqueries, IN,
NOT IN, EXISTS, NOT EXISTS, and
certain anti-join forms can all be routed toward the same small set of
bitmap primitives rather than building separate execution paths for
every SQL surface form.
Aggregation and Late
Materialization
Aggregation should happen after candidate reduction.
For a grouped aggregate:
select l_orderkey, sum(l_extendedprice)
from lineitem
where l_shipdate < date '1995-03-15'
group by l_orderkey
the physical path should be:
- Produce a candidate bitmap from the date predicate.
- Materialize only
l_orderkey and
l_extendedprice for those candidates.
- Accumulate grouped state.
- Materialize only final output fields.
The same model applies across joins. Relationship vectors reduce the
graph first; grouping fields, aggregate inputs, residual predicate
fields, and final projection fields are hydrated afterward.
That is the discipline: use bitmaps to decide which rows matter, then
hydrate only the values needed to answer the query.
Optimizer Direction
The optimizer's long-term job is to choose a reduction order over a
graph of bitmap domains.
For star and snowflake schemas, small dimension filters can produce
compact candidate sets. Relationship vectors can then push those sets
into the fact table domain before fact table materialization. In the
other direction, a selective time range or fact predicate can shrink the
fact table and then pull constraints back toward dimensions.
The optimizer should eventually reason about:
- Cardinality of each table role.
- Selectivity of predicates.
- Cost of relationship-vector projection.
- Cost of BSI range and comparison operations.
- Cost of materialization by representation type.
- Cost of residual predicates.
- Time-shard and node locality.
- Whether a seed bitmap is already cached.
- Whether a candidate set is cheap enough to pass to a node.
- Whether a broad node-side seed or shard-local filter is
cheaper.
This is where QuantaStream may become genuinely distinct. The
optimizer is not just choosing join order. It is choosing the order in
which compressed constraints should flow through a graph.
TPC-H as an Architectural
Microcosm
TPC-H is useful because it contains many of the shapes QuantaStream
cares about:
- A large fact-like table:
lineitem.
- Header/fact relationship:
orders.
- Dimensions:
customer, supplier,
part, nation, region.
- A bridge-like table:
partsupp.
- Date ranges, string dictionaries, numeric BSIs, grouped aggregates,
correlated membership, same-row comparisons, and multi-hop joins.
The current local work has shown that these query shapes can be
represented by the new SQL, planner, runtime, relationship-vector, and
materialization stack. That is not yet a benchmark claim. It is an
important correctness and architecture signal: the engine is beginning
to answer real analytical shapes through the bitmap-native path.
The next proof point should be larger scale-factor data on controlled
hardware, with reproducible MySQL and QuantaStream baselines.
Patent Context
The project has prior IP context around bitmap representation and
bitmap-based query processing.
The granted Disney patent US11392606, "System and method
for converting user data from disparate sources to bitmap data,"
describes converting data from multiple sources into a conformed data
set and then into bitmap-oriented representation. The public patent
record lists Dakshinamurthi Rajavel, Guy Molinari, Ryan J. Junk, and
Rajagopal Baskaran as inventors.
The related Disney join patent is US12086136,
"Techniques for Executing Join Operations Using Bitmap Indices." The
public record lists Guy Molinari as the inventor, Disney Enterprises,
Inc. as the assignee, a February 4, 2020 filing date, and a September
10, 2024 grant date. This patent is critical because it is the
foundation of vector-based joins: join processing can be expressed by
producing child or parent result bitmaps and translating those sets
through BSI-backed relationship structures.
These references should be treated as historical and strategic
context. They do not define the full QuantaStream design, and this paper
does not attempt to interpret patent scope. The current QuantaStream
architecture adds a concrete SQL compatibility surface,
relationship-vector execution, late materialization, native runtime
inspection, direct and standard deployment modes, and an implementation
path built around modern Roaring bitmap/BSI primitives.
Relationship to Roaring
Bitmaps
Roaring bitmaps are the practical compression foundation. They
provide a well-known compressed bitmap representation with fast set
operations, and the Roaring ecosystem is the right place for core BSI
improvements that are generally useful beyond QuantaStream.
QuantaStream should avoid private forks of fundamental bitmap
algorithms where possible. When the BSI library needs better primitives,
the ideal path is to produce polished, benchmark-backed contributions
upstream. That includes:
- Faster
BatchEqual-style membership operations.
- BSI-to-BSI comparison operators.
- More professional BSI tests and benchmarks.
- Clear documentation of where 64-bit BSI behavior differs from 32-bit
BSI behavior.
The database and the bitmap library should evolve together, but with
clean boundaries. QuantaStream should express database intent. Roaring
should expose correct, efficient bitmap and BSI primitives.
What Makes This Different
The differentiator is not simply "uses bitmaps." Many systems use
bitmap indexes.
The differentiator is that QuantaStream treats compressed bitmap
domains as the native query execution substrate:
- SQL is parsed and planned into bitmap-capable intermediate
forms.
- Table roles remain separate rownum domains until explicitly
translated.
- Relationship vectors perform domain translation.
- Boolean logic is lowered into set algebra.
- Same-row comparisons are intended to be BSI comparisons, not row
scans.
- Semi-joins and anti-joins become membership and difference.
- Aggregation is fed by reduced candidate sets.
- Materialization is late and field-specific.
- Runtime inspection exposes the physical algebra used to answer a
query.
The guiding line is worth preserving:
QuantaStream does not move rows through joins; it moves constraints
through compressed bitmap domains until only the necessary rows
remain.
Current Limits
The architecture is promising, but the work is not done.
- The cost optimizer is still early.
- SQL support is broadening, but not complete.
- Full MySQL compatibility is a goal, not a completed claim.
- Larger scale-factor TPC-H and compatibility benchmarks are still
needed.
- The batch and streaming load paths need substantial work.
- Startup time and shard manifest handling need continued
hardening.
- Future BSI library work remains an optimization frontier, but the
current same-row comparison path is available from the selected Roaring
dependency.
- High-cardinality string representation still needs the StringLexBSI
design to mature.
- Global cross-session query caching remains a future feature, not a
crutch the current engine requires.
These limits are healthy. They keep the project honest.
Near-Term Proof Points
The most useful next proof points are:
- Keep the TPC-H query suite green in both direct and standard
modes.
- Run reproducible MySQL versus QuantaStream compatibility and
benchmark labs.
- Add larger scale-factor data on controlled hardware.
- Finish BSI comparison work with upstream-quality tests and
benchmarks.
- Improve load-path throughput before relying on larger public
demos.
- Continue reducing materialization where a bitmap or BSI primitive
can answer directly.
- Start cost-based optimization from table cardinality, predicate
selectivity, and relationship-vector reduction cost.
Conclusion
QuantaStream's core algebra is compact:
selection -> bitmap production
AND -> intersection
OR -> union
NOT -> difference
range/equality -> BSI or dictionary bitmap
same-row cmp -> BSI-to-BSI comparison
join -> relationship-vector domain translation
EXISTS -> membership
NOT EXISTS -> difference
aggregation -> reduced candidates plus late materialization
That compact algebra is the project.
The product expression is SQL. The execution expression is bitmap
algebra. The engineering challenge is to make those two worlds line up
cleanly enough that a user can write ordinary analytical SQL while the
engine quietly does something unusually powerful underneath.
References
SQL analítico nativo de bitmaps
Estado: borrador v0.1, documento interno de trabajo. Última
actualización: 2026-07-19
Este documento es una narrativa de ingeniería para QuantaStream. No
es un análisis legal, un cuadro de reivindicaciones de patente, un
informe de benchmarks ni un documento final de posicionamiento público.
Su propósito es preservar la tesis arquitectónica mientras el motor
sigue evolucionando rápidamente.
Resumen ejecutivo
QuantaStream se construye alrededor de una idea simple:
SQL analítico nativo de bitmaps.
La base de datos debe aceptar SQL familiar, pero el modelo físico de
ejecución debe evitar tratar SQL como una instrucción para ensamblar
filas de forma anticipada. En cambio, las consultas se reducen a
restricciones sobre dominios de bitmaps comprimidos. Filtros, joins,
semi-joins, anti-joins, entradas de agrupación y comparaciones dentro de
la misma fila se convierten en operaciones de conjuntos sobre dominios
de números de fila, índices bit-sliced, diccionarios y vectores de
relación. Las filas se rehidratan solo después de que los conjuntos
candidatos ya se han reducido.
Esa es la distinción central: QuantaStream no es un motor de filas
con índices bitmap añadidos encima. Es un motor de ejecución sobre
dominios bitmap con una interfaz SQL.
Motivación
Los motores relacionales tradicionales son extraordinariamente
capaces, pero sus operadores físicos suelen girar alrededor de mover,
hashear, ordenar y materializar tuplas. Los almacenes columnares modernos
mejoran la localidad y la compresión, pero muchos siguen pagando costos
importantes cuando una consulta requiere joins, membresía correlacionada,
subconsultas, agregados agrupados o traducción repetida de dominios
entre tablas de hechos y dimensiones.
QuantaStream toma otro camino. Intenta mantener la consulta en forma
de conjuntos comprimidos durante el mayor tiempo posible:
AND se convierte en intersección de bitmaps.
OR se convierte en unión de bitmaps.
NOT, anti-join y NOT IN se convierten en
diferencia de bitmaps.
- Los predicados de igualdad y rango sobre dominios numéricos,
temporales y de strings codificados producen bitmaps candidatos.
- Las relaciones de join se representan como vectores que traducen
conjuntos candidatos entre dominios de números de fila.
- La agregación opera después de la reducción de candidatos,
materializando solo los campos requeridos para agrupar, ordenar, alimentar
agregados, evaluar predicados residuales y producir la proyección
final.
El resultado es un modelo de ejecución donde SQL se convierte en
propagación de restricciones sobre dominios de bitmaps comprimidos.
Vocabulario central
QuantaStream necesita términos precisos porque los motores bitmap y
las bases de datos relacionales usan palabras parecidas con significados
distintos.
rownum : El identificador de tupla dentro de una tabla.
Es la identidad relacional de fila utilizada por el motor de consultas.
No es lo mismo que un "row id" de bitmap en la nomenclatura heredada.
bitmap : Un conjunto comprimido de rownums,
normalmente representado con Roaring bitmaps. Un bitmap responde la
pregunta "¿qué filas son candidatas actualmente?"
standard bitmap : Un bitmap asociado a un valor
discreto. Los valores enum de baja cardinalidad y los estados booleanos
encajan naturalmente aquí.
multiplicity : El modelo de cardinalidad de una columna.
scalar significa un valor lógico por fila.
set significa que una fila puede pertenecer a múltiples
bitmaps de valor para la misma columna.
BSI : Un índice bit-sliced. Un BSI representa valores
numéricos, timestamps o strings codificados de una forma que permite
igualdad, rango, comparación y operaciones similares a agregación sin
rehidratar primero todos los valores originales.
StringEnum : Una representación de strings de baja
cardinalidad respaldada por diccionario. Los valores se asignan a ids de
diccionario estables, y cada id puede representarse como un standard
bitmap.
backing string : Una representación de strings de alta
cardinalidad donde la ruta bitmap/BSI transporta un valor comparable
compacto y el valor original está disponible a través de KVStore cuando
se necesita rehidratación.
relationship vector : Un BSI que mapea rownums de un
dominio de tabla a rownums de otro dominio de tabla. En la práctica, es
la representación nativa del motor para relaciones padre-hijo.
seed bitmap : Un bitmap de existencia/candidatos de
primera clase para una tabla o shard. Una seed responde "¿qué filas
existen?" sin sintetizar la respuesta a través de una gran cantidad de
fragmentos de predicados independientes.
Representación de datos
El modelo central de representación es intencionalmente conectable,
pero sus primitivas son pocas:
- Strings de baja cardinalidad y booleanos se representan como
standard bitmaps.
- Valores numéricos se representan como BSIs numéricos.
- Timestamps se representan como BSIs de timestamp con una granularidad
explícita.
- Strings de alta cardinalidad pueden representarse mediante lookup
compacto BSI/hash más almacenamiento de respaldo.
- Columnas de relación se representan como BSIs vectoriales.
- La existencia puede representarse como una seed bitmap de tabla o de
shard.
El objetivo es reducir tipos físicos especiales. Un esquema debe
describir la semántica de una columna y las decisiones de representación:
cardinalidad, multiplicidad, granularidad temporal, precisión numérica,
longitud de prefijo, longitud máxima, capacidad de búsqueda, comportamiento
de diccionario y política de rehidratación.
Eso permite que el planner razone sobre una columna en términos de
capacidades:
- ¿Puede esta columna producir un bitmap de igualdad?
- ¿Puede producir un bitmap de rango?
- ¿Puede participar en matching por prefijo?
- ¿Puede realizar comparaciones BSI dentro de la misma fila?
- ¿Requiere lookup de diccionario para los valores originales?
- ¿Necesita rehidratación desde KVStore?
- ¿Puede usarse como un relationship vector?
El optimizador debe tomar decisiones desde capacidades, no desde
nombres históricos de tipos.
Álgebra de selección
Un predicado sobre una sola tabla se reduce a una expresión bitmap:
where age >= 30 and status in ('ACTIVE', 'TRIAL')
se convierte en:
INTERSECT(
BSI_RANGE(age, 30, +inf),
UNION(
BITMAP(status = 'ACTIVE'),
BITMAP(status = 'TRIAL')
)
)
El resultado es un bitmap candidato de rownums. Todavía no hace falta
que existan filas materializadas. El motor también puede representar
!=, NOT IN y anti-membresía como diferencias
desde una seed:
DIFFERENCE(
SEED(customers),
BITMAP(status = 'DELETED')
)
Esto es importante porque la ausencia y la negación no son ideas
secundarias. Son operaciones de conjuntos nativas.
Álgebra booleana
La reducción de predicados booleanos debe preservar la semántica SQL
mientras favorece el álgebra bitmap:
A AND B -> INTERSECT(A, B)
A OR B -> UNION(A, B)
NOT A -> DIFFERENCE(seed, A)
A AND NOT B -> DIFFERENCE(A, B)
El planner debe respetar paréntesis, semántica SQL de tres valores
cuando aplique, y comportamiento de NULL. El objetivo físico, sin
embargo, sigue siendo simple: producir bitmaps candidatos y combinarlos
con álgebra de conjuntos.
Esto le da al optimizador una libertad útil: puede ordenar reducciones
bitmap selectivas antes de scans residuales costosos, y puede evitar
materializar columnas que solo existen para reducir conjuntos
candidatos.
Álgebra BSI
Los BSIs extienden la selección bitmap más allá de la membresía en
valores discretos.
Para una sola columna BSI:
- La igualdad produce un bitmap de filas cuyo valor codificado es igual
a un literal.
- El rango produce un bitmap de filas dentro de un límite inferior y
superior.
- Las variantes mayor-que y menor-que producen bitmaps candidatos
direccionales.
- La igualdad en lote puede combinar muchas sondas de igualdad en un
solo resultado de membresía.
Para dos columnas BSI en el mismo dominio de rownums:
where l_receiptdate > l_commitdate
debería convertirse en:
BSI_COMPARE_GT(l_receiptdate, l_commitdate)
Eso devuelve un bitmap directamente. El punto importante es que una
comparación de campos dentro de la misma fila no debería requerir
materializar ambos valores para cada fila candidata y compararlos en Go.
Eso es andamiaje temporal de implementación, no el álgebra deseada.
Esta es una razón por la que el trabajo de Roaring BSI importa. APIs
como la comparación BSI-a-BSI permiten que QuantaStream exprese la
intención de la consulta en el nivel físico correcto.
Álgebra de joins
El modelo de join es el corazón de QuantaStream.
En un plan convencional de ejecución relacional, un join suele
construir tuplas unidas o una estructura hash sobre un lado y hacer
probes desde el otro. En QuantaStream, la operación física preferida es
la propagación de restricciones mediante relationship vectors.
Este es el descendiente arquitectónico directo del trabajo de patente
sobre joins con bitmaps. La patente no es simplemente IP de fondo; es la
base para tratar joins como traducción vectorial entre dominios de
rownums bitmap, en lugar de ensamblaje de tuplas. El modelo de ejecución
con relationship vectors de QuantaStream es la expresión moderna de
ingeniería de esa idea.
Para una relación padre-hijo:
orders.o_orderkey -> lineitem.l_orderkey
QuantaStream puede almacenar un BSI relationship vector:
lineitem rownum -> orders rownum
Esto le da al planner dos direcciones de movimiento:
- Padre-a-hijo: aplicar un conjunto candidato de orders al relationship
vector de lineitem y producir los rownums de lineitem correspondientes.
- Hijo-a-padre: transponer o reducir un conjunto candidato de lineitem
a través del relationship vector y producir los rownums de orders
correspondientes.
Eso significa que la ejecución de joins puede verse como un proceso de
ajustar repetidamente los conjuntos candidatos para cada rol de tabla:
candidates(customer) -> relationship vector -> candidates(orders)
candidates(orders) -> relationship vector -> candidates(lineitem)
candidates(lineitem) -> relationship vector -> candidates(orders)
Cada rol de tabla conserva su propio dominio de rownums. El planner
debe saber cuándo un conjunto cruza dominios de rownums, y debe
traducirlo explícitamente a través de un relationship vector. Un bitmap
de una tabla nunca se compara casualmente con un bitmap de otra tabla.
Semi-joins y anti-joins
Los semi-joins y anti-joins surgen naturalmente del álgebra bitmap.
EXISTS es membresía:
outer candidates INTERSECT rows_with_matching_inner
NOT EXISTS es diferencia:
outer candidates DIFFERENCE rows_with_matching_inner
Esto es estratégicamente importante. Subconsultas SQL,
IN, NOT IN, EXISTS,
NOT EXISTS y ciertas formas de anti-join pueden encaminarse
hacia el mismo conjunto pequeño de primitivas bitmap, en lugar de crear
rutas de ejecución separadas para cada forma superficial de SQL.
Agregación y
materialización tardía
La agregación debe ocurrir después de la reducción de candidatos.
Para un agregado agrupado:
select l_orderkey, sum(l_extendedprice)
from lineitem
where l_shipdate < date '1995-03-15'
group by l_orderkey
la ruta física debería ser:
- Producir un bitmap candidato desde el predicado de fecha.
- Materializar solo
l_orderkey y
l_extendedprice para esos candidatos.
- Acumular el estado agrupado.
- Materializar solo los campos finales de salida.
El mismo modelo aplica a través de joins. Los relationship vectors
reducen primero el grafo; los campos de agrupación, las entradas de
agregados, los campos de predicados residuales y los campos de proyección
final se hidratan después.
Esa es la disciplina: usar bitmaps para decidir qué filas importan, y
luego hidratar solo los valores necesarios para responder la consulta.
Dirección del optimizador
El trabajo de largo plazo del optimizador es elegir un orden de
reducción sobre un grafo de dominios bitmap.
Para esquemas estrella y snowflake, filtros pequeños de dimensiones
pueden producir conjuntos candidatos compactos. Los relationship vectors
pueden empujar esos conjuntos hacia el dominio de la tabla de hechos
antes de materializarla. En la otra dirección, un rango temporal
selectivo o un predicado de hechos puede reducir la tabla de hechos y
luego jalar restricciones de vuelta hacia las dimensiones.
El optimizador eventualmente debería razonar sobre:
- Cardinalidad de cada rol de tabla.
- Selectividad de predicados.
- Costo de proyección mediante relationship vector.
- Costo de operaciones BSI de rango y comparación.
- Costo de materialización por tipo de representación.
- Costo de predicados residuales.
- Localidad temporal de shards y nodos.
- Si una seed bitmap ya está en caché.
- Si un conjunto candidato es suficientemente barato para enviarse a
un nodo.
- Si una seed amplia del lado del nodo o un filtro local al shard es
más barato.
Aquí es donde QuantaStream puede volverse genuinamente distinto. El
optimizador no solo está eligiendo orden de joins. Está eligiendo el
orden en que las restricciones comprimidas deben fluir a través de un
grafo.
TPC-H como microcosmos
arquitectónico
TPC-H es útil porque contiene muchas de las formas que le importan a
QuantaStream:
- Una tabla grande tipo hechos:
lineitem.
- Relación encabezado/hecho:
orders.
- Dimensiones:
customer, supplier,
part, nation, region.
- Una tabla tipo puente:
partsupp.
- Rangos de fechas, diccionarios de strings, BSIs numéricos,
agregados agrupados, membresía correlacionada, comparaciones dentro de
la misma fila y joins de múltiples saltos.
El trabajo local actual ha mostrado que estas formas de consulta
pueden representarse mediante la nueva pila SQL, planner, runtime,
relationship-vector y materialización. Eso todavía no es una afirmación
de benchmark. Es una señal importante de corrección y arquitectura: el
motor está empezando a responder formas analíticas reales a través de la
ruta bitmap-native.
El siguiente punto de prueba debería ser datos con scale factor más
grande en hardware controlado, con baselines reproducibles de MySQL y
QuantaStream.
Contexto de patentes
El proyecto tiene contexto previo de IP alrededor de representación
bitmap y procesamiento de consultas basado en bitmaps.
La patente concedida a Disney US11392606, "System and
method for converting user data from disparate sources to bitmap data",
describe convertir datos de múltiples fuentes en un conjunto de datos
conformado y luego en una representación orientada a bitmaps. El registro
público de la patente lista a Dakshinamurthi Rajavel, Guy Molinari, Ryan
J. Junk y Rajagopal Baskaran como inventores.
La patente relacionada de Disney sobre joins es
US12086136, "Techniques for Executing Join Operations Using
Bitmap Indices." El registro público lista a Guy Molinari como inventor,
a Disney Enterprises, Inc. como cesionaria, una fecha de presentación del
4 de febrero de 2020 y una fecha de concesión del 10 de septiembre de
2024. Esta patente es crítica porque es la base de los joins basados en
vectores: el procesamiento de joins puede expresarse produciendo bitmaps
resultado del lado hijo o padre y traduciendo esos conjuntos a través de
estructuras de relación respaldadas por BSI.
Estas referencias deben tratarse como contexto histórico y
estratégico. No definen el diseño completo de QuantaStream, y este
documento no intenta interpretar el alcance de las patentes. La
arquitectura actual de QuantaStream añade una superficie concreta de
compatibilidad SQL, ejecución con relationship vectors, materialización
tardía, inspección nativa de runtime, modos de despliegue direct y
standard, y una ruta de implementación basada en primitivas modernas de
Roaring bitmap/BSI.
Relación con Roaring Bitmaps
Roaring bitmaps son la base práctica de compresión. Proveen una
representación de bitmap comprimido bien conocida con operaciones de
conjuntos rápidas, y el ecosistema Roaring es el lugar correcto para
mejoras BSI centrales que sean útiles más allá de QuantaStream.
QuantaStream debe evitar forks privados de algoritmos bitmap
fundamentales cuando sea posible. Cuando la biblioteca BSI necesita
mejores primitivas, la ruta ideal es producir contribuciones pulidas,
respaldadas por benchmarks, hacia upstream. Eso incluye:
- Operaciones de membresía más rápidas tipo
BatchEqual.
- Operadores de comparación BSI-a-BSI.
- Pruebas y benchmarks BSI más profesionales.
- Documentación clara de dónde el comportamiento BSI de 64 bits difiere
del comportamiento BSI de 32 bits.
La base de datos y la biblioteca bitmap deben evolucionar juntas, pero
con fronteras limpias. QuantaStream debe expresar intención de base de
datos. Roaring debe exponer primitivas bitmap y BSI correctas y
eficientes.
Qué lo hace diferente
El diferenciador no es simplemente "usa bitmaps." Muchos sistemas usan
índices bitmap.
El diferenciador es que QuantaStream trata los dominios bitmap
comprimidos como el sustrato nativo de ejecución de consultas:
- SQL se parsea y planifica hacia formas intermedias capaces de usar
bitmaps.
- Los roles de tabla permanecen en dominios de rownums separados hasta
que se traducen explícitamente.
- Los relationship vectors realizan traducción de dominio.
- La lógica booleana se reduce a álgebra de conjuntos.
- Las comparaciones dentro de la misma fila están destinadas a ser
comparaciones BSI, no scans de filas.
- Semi-joins y anti-joins se convierten en membresía y diferencia.
- La agregación se alimenta de conjuntos candidatos reducidos.
- La materialización es tardía y específica por campo.
- La inspección de runtime expone el álgebra física usada para
responder una consulta.
Vale la pena conservar la línea guía:
QuantaStream no mueve filas a través de joins; mueve restricciones a
través de dominios de bitmaps comprimidos hasta que solo quedan las filas
necesarias.
Límites actuales
La arquitectura es prometedora, pero el trabajo no está terminado.
- El optimizador de costos todavía está en una etapa temprana.
- El soporte SQL se está ampliando, pero no está completo.
- La compatibilidad total con MySQL es una meta, no una afirmación
completada.
- Todavía se necesitan benchmarks TPC-H y de compatibilidad con scale
factors más grandes.
- Las rutas de carga por lotes y streaming necesitan trabajo
sustancial.
- El tiempo de arranque y el manejo del manifiesto de shards necesitan
seguir endureciéndose.
- El trabajo futuro en la biblioteca BSI sigue siendo una frontera de
optimización, pero la ruta actual de comparación dentro de la misma fila
está disponible desde la dependencia Roaring seleccionada.
- La representación de strings de alta cardinalidad todavía necesita
que el diseño StringLexBSI madure.
- La caché global de consultas entre sesiones sigue siendo una función
futura, no una muleta que el motor actual requiera.
Estos límites son saludables. Mantienen honesto al proyecto.
Puntos de prueba a corto plazo
Los próximos puntos de prueba más útiles son:
- Mantener la suite de consultas TPC-H en verde tanto en modo direct
como standard.
- Ejecutar laboratorios reproducibles de compatibilidad y benchmark
MySQL versus QuantaStream.
- Añadir datos con scale factors más grandes en hardware controlado.
- Completar el trabajo de comparación BSI con pruebas y benchmarks de
calidad upstream.
- Mejorar el throughput de la ruta de carga antes de depender de demos
públicas más grandes.
- Seguir reduciendo materialización donde una primitiva bitmap o BSI
pueda responder directamente.
- Iniciar la optimización basada en costos desde cardinalidad de tabla,
selectividad de predicados y costo de reducción por relationship
vector.
Conclusión
El álgebra central de QuantaStream es compacta:
selection -> bitmap production
AND -> intersection
OR -> union
NOT -> difference
range/equality -> BSI or dictionary bitmap
same-row cmp -> BSI-to-BSI comparison
join -> relationship-vector domain translation
EXISTS -> membership
NOT EXISTS -> difference
aggregation -> reduced candidates plus late materialization
Esa álgebra compacta es el proyecto.
La expresión de producto es SQL. La expresión de ejecución es álgebra
bitmap. El desafío de ingeniería es hacer que esos dos mundos se alineen
con suficiente limpieza para que una persona pueda escribir SQL analítico
ordinario mientras el motor hace discretamente algo inusualmente poderoso
por debajo.
Referencias