Add note files about joins, aggregations, and distributed engines
This commit is contained in:
parent
8ed8347380
commit
9c6f689447
146
hqew/008-joins-and-aggregations.md
Normal file
146
hqew/008-joins-and-aggregations.md
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
# Joins and Aggregations
|
||||||
|
|
||||||
|
A reference for two of the most important and expensive families of query operators.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Short answer
|
||||||
|
|
||||||
|
Joins combine related data from multiple inputs.
|
||||||
|
|
||||||
|
Aggregations collapse many rows into summaries.
|
||||||
|
|
||||||
|
These operators matter because they often dominate runtime, memory use, and optimization effort.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Joins
|
||||||
|
|
||||||
|
### What a join does
|
||||||
|
|
||||||
|
A join matches rows from two inputs according to some condition.
|
||||||
|
|
||||||
|
Common cases include:
|
||||||
|
|
||||||
|
- equality joins on keys
|
||||||
|
- outer joins preserving unmatched rows
|
||||||
|
- semi-joins for existence checks
|
||||||
|
|
||||||
|
### Common join algorithms
|
||||||
|
|
||||||
|
#### Nested-loop join
|
||||||
|
|
||||||
|
Compare rows from one side against rows from the other.
|
||||||
|
|
||||||
|
Strength:
|
||||||
|
|
||||||
|
- simple
|
||||||
|
|
||||||
|
Weakness:
|
||||||
|
|
||||||
|
- usually expensive on large inputs
|
||||||
|
|
||||||
|
#### Hash join
|
||||||
|
|
||||||
|
Build a hash table on one side, then probe it with the other side.
|
||||||
|
|
||||||
|
Strength:
|
||||||
|
|
||||||
|
- often very good for equality joins
|
||||||
|
|
||||||
|
Weakness:
|
||||||
|
|
||||||
|
- needs memory for the build side
|
||||||
|
|
||||||
|
#### Sort-merge join
|
||||||
|
|
||||||
|
Sort both sides by join key, then merge them.
|
||||||
|
|
||||||
|
Strength:
|
||||||
|
|
||||||
|
- useful when inputs are already sorted or ordering is needed
|
||||||
|
|
||||||
|
Weakness:
|
||||||
|
|
||||||
|
- sorting can be expensive
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why join order matters
|
||||||
|
|
||||||
|
If a query has several joins, the engine may have many legal join orders.
|
||||||
|
|
||||||
|
Different orders can create radically different intermediate sizes, which is why join planning is one of the hardest and most important optimizer
|
||||||
|
tasks.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aggregations
|
||||||
|
|
||||||
|
### What an aggregation does
|
||||||
|
|
||||||
|
An aggregation computes summary values such as:
|
||||||
|
|
||||||
|
- `COUNT`
|
||||||
|
- `SUM`
|
||||||
|
- `AVG`
|
||||||
|
- `MIN`
|
||||||
|
- `MAX`
|
||||||
|
|
||||||
|
It may do this:
|
||||||
|
|
||||||
|
- globally over all rows
|
||||||
|
- per group, such as `GROUP BY department`
|
||||||
|
|
||||||
|
### Common aggregation strategies
|
||||||
|
|
||||||
|
#### Streaming aggregation
|
||||||
|
|
||||||
|
Works well when input is already grouped or sorted appropriately.
|
||||||
|
|
||||||
|
#### Hash aggregation
|
||||||
|
|
||||||
|
Uses a hash table keyed by grouping columns.
|
||||||
|
|
||||||
|
Strength:
|
||||||
|
|
||||||
|
- common and flexible
|
||||||
|
|
||||||
|
Weakness:
|
||||||
|
|
||||||
|
- memory pressure for many groups
|
||||||
|
|
||||||
|
#### Partial aggregation
|
||||||
|
|
||||||
|
Aggregate locally first, then merge partial results later.
|
||||||
|
|
||||||
|
This is especially important in distributed systems.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why aggregations are tricky
|
||||||
|
|
||||||
|
Aggregations are conceptually simple but operationally important because they can:
|
||||||
|
|
||||||
|
- change row cardinality dramatically
|
||||||
|
- create blocking behavior
|
||||||
|
- require state per group
|
||||||
|
- interact with nulls and types carefully
|
||||||
|
|
||||||
|
So they are simple algebraically but serious at runtime.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Practical mental model
|
||||||
|
|
||||||
|
Joins expand and combine structure.
|
||||||
|
|
||||||
|
Aggregations compress and summarize structure.
|
||||||
|
|
||||||
|
Those two directions explain why they sit at the center of so much query-engine design.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* **April 1, 2026** -- First version created.
|
||||||
107
hqew/009-distributed-query-engines.md
Normal file
107
hqew/009-distributed-query-engines.md
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
# Distributed Query Engines
|
||||||
|
|
||||||
|
A reference for what changes when query execution moves from one machine to many.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Short answer
|
||||||
|
|
||||||
|
A distributed query engine is not just a single-node engine with remote workers.
|
||||||
|
|
||||||
|
Once execution is spread across machines, the engine needs extra architecture for:
|
||||||
|
|
||||||
|
- partitioning data
|
||||||
|
- moving data between stages
|
||||||
|
- scheduling tasks
|
||||||
|
- handling failures
|
||||||
|
|
||||||
|
Those concerns become first-order design problems.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The basic shape
|
||||||
|
|
||||||
|
Most distributed engines have:
|
||||||
|
|
||||||
|
- a coordinator or planner
|
||||||
|
- workers or executors
|
||||||
|
- partitioned input data
|
||||||
|
- exchange or shuffle steps
|
||||||
|
- a final result collection stage
|
||||||
|
|
||||||
|
The plan is usually broken into fragments or stages that can run in parallel.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What distribution adds
|
||||||
|
|
||||||
|
### Partitioning
|
||||||
|
|
||||||
|
Data is split across machines, often by file boundaries, shards, or key ranges.
|
||||||
|
|
||||||
|
### Exchange / shuffle
|
||||||
|
|
||||||
|
Rows or batches are moved across the network so that later operators see the right grouping or join partition.
|
||||||
|
|
||||||
|
### Scheduling
|
||||||
|
|
||||||
|
The system decides where tasks run and when.
|
||||||
|
|
||||||
|
### Fault tolerance
|
||||||
|
|
||||||
|
The engine needs some strategy for retries, recomputation, or checkpointing.
|
||||||
|
|
||||||
|
### Coordination overhead
|
||||||
|
|
||||||
|
Network, serialization, and orchestration can easily dominate runtime if the plan is badly shaped.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why distributed execution is hard
|
||||||
|
|
||||||
|
The main difficulty is that a plan that looks cheap algebraically may be expensive once network movement is included.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
- a join may require shuffling huge datasets
|
||||||
|
- a group-by may need global repartitioning by key
|
||||||
|
- skewed keys may overload one worker
|
||||||
|
|
||||||
|
So distributed optimization is partly about minimizing data movement, not just local operator cost.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Common patterns
|
||||||
|
|
||||||
|
### Map-then-reduce style
|
||||||
|
|
||||||
|
Local work happens close to the data, then partial results are shuffled and merged.
|
||||||
|
|
||||||
|
### Stage DAGs
|
||||||
|
|
||||||
|
Execution is represented as a directed acyclic graph of stages separated by exchange boundaries.
|
||||||
|
|
||||||
|
### Partial then final aggregation
|
||||||
|
|
||||||
|
Workers compute local aggregates, then a later stage merges them.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Practical mental model
|
||||||
|
|
||||||
|
Single-node engines mostly optimize CPU, memory, and local I/O.
|
||||||
|
|
||||||
|
Distributed engines must also optimize:
|
||||||
|
|
||||||
|
- network traffic
|
||||||
|
- partition balance
|
||||||
|
- task scheduling
|
||||||
|
- failure recovery
|
||||||
|
|
||||||
|
That is why distributed query processing is a second architecture layer rather than a small extension.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* **April 1, 2026** -- First version created.
|
||||||
Loading…
x
Reference in New Issue
Block a user