Index

Page numbers do not exist in a web book, so this index points at chapters. Generated by scripts/assemble.py from declared key_terms and section headings — add a term to a chapter's front matter to get it in here.

0

  • 0. is this the problem? — 26

1

  • 1. atomic commits — 10
  • 1. compaction — 10
  • 1. ingestion — 5
  • 1. offset pagination — 16
  • 1. row_number — the general answer — 18
  • 1. the consumer rebalance — 4
  • 1. there are no directories — 9
  • 1. what is the deadline? — 26

2

  • 2. cursor / keyset pagination — 16
  • 2. distinct on — postgresql and duckdb — 18
  • 2. log cleanup and checkpoints — 10
  • 2. objects are immutable — 9
  • 2. snapshot isolation — 10
  • 2. storage — 5
  • 2. the straggler — 4
  • 2. where did it stop? — 26

3

  • 3. backpressure, or its absence — 4
  • 3. group by with aggregates — 18
  • 3. operations are billed and rate-limited — 9
  • 3. page-token pagination — 16
  • 3. schema enforcement — 10
  • 3. transformation — 5
  • 3. vacuum — 10
  • 3. which of the four is it? — 26

4

  • 4. distinct on the whole row — 18
  • 4. link-header pagination — 16
  • 4. orchestration — 5
  • 4. the decision: stale, or possibly wrong? — 26
  • 4. the thundering herd — 4
  • 4. time travel — 10

5

  • 5. before recovering: check retention — 26
  • 5. cascading failure — 4
  • 5. data quality — 5
  • 5. efficient row-level deletes and updates — 10

6

  • 6. catalog and governance — 5

7

  • 7. bi and analytics — 5
  • 7. recover — 26

8

  • 8. data impact — 26
  • 8. reverse etl — 5

A

  • a measured comparison — 22
  • a week, honestly — 1
  • a worked system design — 39
  • abac — 30
  • absences — 25
  • absorb before you adopt — 12
  • acceptance criterion — 38
  • access control — 30
  • access paths — 7
  • accumulating snapshot — 6
  • accuracy — 23
  • acks — 15
  • acks, and what each level costs — 15
  • action item — 26
  • actionability — 25
  • adaptive query execution — 21
  • additive measure — 6
  • after image — 14
  • aggregate — 36
  • alert fatigue — 25, 26
  • alerts that get acted on — 25
  • allowed lateness — 29
  • alternatives considered — 3
  • analytics engineering — 1, 40
  • anomaly detection, honestly — 23
  • anonymization — 31
  • anonymization, and why it usually isn't — 31
  • apache arrow — 22
  • append-only — 34
  • apply — 28
  • approximate nearest neighbour — 12
  • aqe — 21
  • architecture decision record — 3
  • arrow: why they interoperate — 22
  • artifact — 27
  • as-of join — 32
  • asset — 24
  • at-least-once — 4, 29, 36
  • at-most-once — 4, 29
  • atomic commits over object storage — 10
  • atomic rename — 10
  • attribution, and the share nobody claims — 33
  • authentication — 16
  • auto-suspend — 33
  • autonomy — 35
  • avro — 11
  • avro: row-binary — 11

B

  • b-tree index — 7
  • b-tree indexes — 7
  • backfill — 13, 20, 24, 32, 34
  • backfill window — 26
  • backfills — 13
  • backflow — 34
  • backoff and jitter — 16
  • backpressure — 4, 15, 29
  • backward compatibility — 17
  • batch — 29
  • batch ingestion — 13
  • batch processing — 3
  • batch scoring — 32
  • batch versus streaming — 3
  • before image — 14
  • behavioral interview — 39
  • big bang migration — 37
  • bigquery — 8
  • binlog — 14
  • bit packing — 8
  • bitmap heap scan — 7
  • blameless postmortem — 26
  • blast radius — 28, 34
  • bloat — 7
  • block compression — 11
  • blue-green — 27
  • bottleneck — 35
  • bounded context — 35
  • breaking change — 17
  • bridge table — 6
  • broadcast join — 21
  • broker — 15
  • bronze layer — 34
  • bronze: what the source sent — 34
  • bucket — 9
  • buckets — 9
  • budget — 28
  • build cache — 27
  • build, buy, or do without — 3
  • burn rate — 26
  • burnout — 40
  • bus matrix — 6
  • business metadata — 30
  • business rule — 23, 38
  • buy, build, or do without — 5

C

  • caching, and why it usually does not help — 21
  • canary — 25, 27
  • cap theorem — 4
  • capstone — 38
  • cardinality — 25
  • catalog — 10
  • catalyst — 21
  • catchup — 24
  • catchup and backfill — 24
  • ccpa — 31
  • certification — 30
  • change data capture — 14, 36
  • change detection — 13
  • change stream — 12
  • changing the partition count breaks ordering — 15
  • chargeback — 33
  • chasm trap — 6
  • check strategy — 20
  • checkpoint — 21, 29
  • choosing — 11, 22
  • choosing a mode — 17
  • choosing the scheme — 9
  • choosing, and not choosing — 12
  • chunking — 13
  • circuit breaker — 16, 23
  • classification — 30
  • clear and rerun — 24
  • clickstream — 1
  • clock skew — 4
  • clustering and sort order — the main lever — 8
  • clustering key — 8
  • coalesce — 21
  • codecs — 11
  • column chunk — 9
  • column mapping — 10
  • column-level lineage — 30
  • columnar — 22
  • columnar format — 11
  • columnar storage — 8
  • command — 36
  • commit — 10
  • communications lead — 26
  • compaction — 9, 10, 36
  • compatibility: backward, forward, full — 17
  • compensation, briefly — 40
  • completeness — 23
  • compression ratio — 11
  • compression, and why columns compress so well — 8
  • compute it — 38
  • concept drift — 32
  • concurrency — 24
  • conformed dimension — 6, 34
  • conformed dimensions and the bus matrix — 6
  • connector offset — 14
  • consensus, briefly, and where you meet it — 4
  • consent — 31
  • consent and purpose limitation — 31
  • consequences — 3
  • consistency — 23
  • consistent hashing — 4
  • consumer — 15
  • consumer group — 15
  • consumer lag — 15, 29
  • consumer rebalance — 4
  • consumer-driven contract — 17
  • consumers and consumer groups — 15
  • consuming a change stream — 14
  • context — 3
  • continuous deployment — 27
  • continuous integration — 27
  • contract test — 16
  • contracts for sources you do not control — 17
  • controller — 31
  • conway's law — 35
  • conway's law, and which way the arrow points — 35
  • copy-on-write — 10, 22
  • correlated subquery — 18
  • cost — 1
  • cost as code — 28
  • cost attribution — 33
  • cost is decided in code — 33
  • cost models, and how not to be surprised — 8
  • cost per order — 33
  • cost per pipeline — 33
  • cost per query — 33
  • coupling — 3, 35
  • covering index — 7
  • cpra — 31
  • cqrs — 36
  • credit — 8, 33
  • crypto-shredding — 31
  • csv — 11
  • cte — 18
  • ctes, and the myth — 18
  • cursor pagination — 16
  • cutover — 37
  • cutover readiness — 37

D

  • dag — 24
  • data architecture — 2, 3
  • data as a product — 35
  • data catalog — 5, 30
  • data contract — 17, 30, 35
  • data docs — 23
  • data downtime — 23
  • data drift — 32
  • data engineering — 1
  • data engineering and its neighbors — 1
  • data engineering lifecycle — 2
  • data impact — 26
  • data interval — 24
  • data lake — 1, 3
  • data lakehouse — 3
  • data leakage — 32
  • data management — 2
  • data mesh — 35
  • data minimization — 31
  • data pipeline — 1
  • data product — 2, 35
  • data product owner — 35
  • data quality — 1, 23
  • data quality as a metric — 23
  • data residency — 31
  • data subject — 31
  • data swamp — 9
  • data that changes retroactively — 16
  • data transfer — 33
  • data warehouse — 1, 3, 8
  • dataframe api — 21
  • dataops — 2
  • dataset — 24
  • dbt package — 19
  • dbt snapshots — 20
  • dead letter — 23
  • dead letter queue — 15
  • dead letter queues — 15
  • debezium — 14
  • debezium and the event envelope — 14
  • decide whether to, before deciding how — 20
  • decision — 3
  • declarative — 28
  • decommissioning — 37
  • deduplication — 18
  • defer — 19, 27
  • deferrable operator — 24
  • definition of done — 38
  • degenerate dimension — 6
  • degraded mode — 26
  • delete+insert — 20
  • deletes and tombstones — 14
  • deletion vector — 10, 31
  • delivery semantics — 4
  • delivery semantics in practice — 15
  • delta encoding — 8
  • delta, iceberg, and hudi — 10
  • denormalization — 12
  • dense_rank — 18
  • deploying the orchestrator — 27
  • deprecation — 17
  • depreciation — 40
  • depth and blast radius — 34
  • designing the event — 36
  • dictionary encoding — 8
  • dictionary page — 11
  • differential privacy — 31
  • digest pinning — 28
  • dimension table — 6
  • dimension tables — 6
  • dimensional modeling — 6
  • discoverability — 30
  • distribution — 25
  • distribution test — 23
  • do you actually have domains? — 35
  • do you need a dedicated vector database? — 12
  • do you need spark? — 21
  • docker — 28
  • docker compose — 5
  • docker: the image is the environment — 28
  • document store — 12
  • document stores — 12
  • documentation and the dag as an artifact — 19
  • domain — 35
  • domain-oriented ownership — 35
  • downsampling — 12
  • drift — 28, 32, 37
  • drift is inevitable — 28
  • driver — 21
  • dsar — 31
  • dual write — 36
  • duckdb — 5, 22
  • duckdb: sql over files — 22
  • duplicates — 14
  • duration — 25
  • duration, and why the threshold is wrong — 25
  • dynamic allocation — 21
  • dynamic data masking — 31
  • dynamic task mapping — 24
  • dynamodb is not quite a key-value store — 12

E

  • eager evaluation — 22
  • egress — 33
  • elasticity — 3
  • elt — 1, 3
  • embedding — 12, 32
  • enabling team — 35
  • enforcement — 10
  • enforcement: four places a contract can bite — 17
  • entity — 32
  • entity key — 32
  • environment — 27
  • environments from one module — 28
  • environments, and why staging is hard — 27
  • ephemeral model — 19
  • erasure — 31
  • error budget — 25, 26
  • error budgets, for data — 26
  • escalation — 26
  • etl — 1, 3
  • etl versus elt — 3
  • evaluating a tool — 5
  • event — 36
  • event carried state transfer — 36
  • event envelope — 14
  • event notification — 36
  • event sourcing — 36
  • event store — 36
  • event time — 4, 29
  • event time versus processing time — 4
  • event time, processing time, and watermarks — 29
  • event-driven architecture — 36
  • eventual consistency — 4, 9
  • eventual consistency, stated precisely — 4
  • evolution — 10
  • exactly-once — 4, 14, 29, 36
  • exactly-once, and why to be suspicious — 4
  • executor — 21, 24, 28
  • expand-contract — 17
  • expand-contract migration — 17
  • expectation suite — 23
  • exponential backoff — 16
  • exposure — 19
  • extract manifest — 13
  • extracting from a key-value store — 12
  • extracting from each — 12
  • extracting from files — 13
  • extracting from legacy systems — 13
  • extracting without causing an outage — 7
  • extraction — 12

F

  • fact table — 6
  • fact table columns — 6
  • fact tables — 6
  • factless fact table — 6
  • fan trap — 6
  • feature — 32
  • feature age — 32
  • feature age: the number nobody computes — 32
  • feature freshness — 32
  • feature store — 32
  • feature versioning — 32
  • federated computational governance — 35
  • file compaction — 33
  • file sizing for bulk loads — 8
  • finding 1: gzipped csv beats parquet + snappy — 11
  • finding 2: sorting made it worse — 11
  • finding personal data you did not know you had — 31
  • finops — 33
  • five ways an api is harder — 16
  • fixed and variable cost — 33
  • fixture — 27
  • fold — 36
  • footer — 9
  • format-preserving encryption — 31
  • forward compatibility — 17
  • forward fix — 27
  • four things you can do with a sensitive column — 31
  • four ways data on-call is different — 26
  • four ways this is harder — 27
  • frame clause — 18
  • freshness — 25
  • freshness check — 23
  • from change stream to table — 14
  • from lake to swamp — 9
  • from notebook to pipeline — 22
  • full compatibility — 17
  • full load — 13
  • full or incremental — 13
  • full refresh — 20

G

  • gaps and islands — 18
  • gdpr — 31
  • generate — 2
  • generate: the stage you do not control — 2
  • generic test — 19
  • getting better on purpose — 40
  • gold layer — 34
  • gold: business definitions, consumed — 34
  • governance as a by-product — 30
  • governing data you do not control — 30
  • grain — 2, 6
  • grain test — 23
  • grant — 30
  • graph databases — 12
  • great expectations — 23
  • gross merchandise value — 1
  • gross revenue — 38
  • group coordinator — 15
  • gui etl — 37
  • gzip — 11

H

  • handling deletes — 13
  • handoff — 26
  • handover — 38
  • hard delete — 13
  • hash diff — 20
  • heap — 7
  • heartbeat — 25
  • high-water mark — 13
  • hive-style partitioning — 9
  • hot partition — 4
  • how a reader skips work — 11
  • how a reader uses that structure — 9
  • how a row store reads — 7
  • how airflow actually breaks — 24
  • how contract programmes fail — 17
  • how it grows — 1
  • how many layers? — 34
  • how mvcc works — 7
  • how people actually find data — 30
  • how this book handles numbers, tools, and cost — 1
  • how to choose — 3
  • hugeint — 22

I

  • idempotency — 1, 4, 13, 20, 24
  • idempotency key — 16
  • idempotency, retries, and clearing — 24
  • idempotency: four strategies, with code — 20
  • idempotent consumer — 36
  • idempotent producer — 15
  • idempotent rebuild — 34
  • idempotent sink — 29
  • identifiers — 7
  • if you do adopt: the order that works — 35
  • image — 28
  • immutability — 34
  • import — 28
  • in-sync replica — 15
  • incident commander — 26
  • incident one: the duplicate rows — 1
  • incident two: the four-thousand-dollar job — 1
  • incremental extraction without a change feed — 16
  • incremental load — 13
  • incremental migration — 37
  • incremental model — 20
  • incremental snapshot — 14
  • incremental strategies across engines — 20
  • index scan — 7
  • indexes from the reader's side — 7
  • individual contributor — 40
  • inference — 32
  • infrastructure as code — 28
  • ingest — 2
  • ingest: getting data in — 2
  • ingestion tool — 5
  • insert_overwrite — 20
  • inside a parquet file — 9, 11
  • instrumenting your own pipelines — 25
  • integer cents — 7, 22
  • integration test — 27
  • interoperability standard — 35
  • inverse conway maneuver — 35
  • inverted index — 12
  • is your central team actually the bottleneck? — 35
  • is_current — 20
  • isolation levels, briefly — 7

J

  • jinja: useful, and then suddenly not — 19
  • jitter — 16
  • job — 21
  • joins in a stream — 29
  • json and json lines — 11
  • json lines — 11
  • jsonb — 7
  • junk dimension — 6

K

  • k-anonymity — 31
  • kafka — 15
  • kafka connect — 14
  • kappa architecture — 29
  • kestrel supply co — 1
  • kestrel through the lifecycle — 2
  • kestrel's 6am runbook — 26
  • kestrel's architecture decision record — 3
  • kestrel's bronze as delta — 10
  • kestrel's lake — 9
  • kestrel's order events — 36
  • kestrel's readiness, and the honest answer — 35
  • kestrel's three generators — 2
  • key — 9
  • key-value store — 12
  • key-value stores — 12
  • know your meter — 33
  • kubernetes — 28
  • kubernetes, honestly — 28

L

  • l-diversity — 31
  • label — 32
  • labeling delay — 32
  • labels are data too — 32
  • lag — 18
  • lakehouse — 3, 10
  • lambda and kappa, with hindsight — 29
  • lambda architecture — 29
  • landing raw — 9
  • late arrivals and the lookback window — 20
  • late-arriving data — 13
  • late-arriving dimension — 20
  • late-arriving dimensions — 20
  • latency — 3, 29
  • lateral join — 18
  • lawful basis — 31
  • layer — 28
  • layer boundary — 34
  • layer drift — 34
  • layer skipping — 34
  • laying out a lake — 9
  • lazy evaluation — 21, 22
  • lead — 18
  • leader-follower — 4
  • leaderless and quorums — 4
  • least privilege — 30
  • leaving a tool — 5
  • legacy system — 37
  • levelling — 39, 40
  • levelling, scope, and the offer — 39
  • lie 3: its granularity is too coarse — 13
  • lie 4: it moves backwards — 13
  • lifecycle policy — 9, 33
  • lineage — 25, 30
  • lineage as an instrument — 25
  • lineage depth — 34
  • lineage: three kinds — 30
  • link header — 16
  • lint — 27
  • liquid clustering — 10
  • live coding — 39
  • load-bearing spreadsheet — 37
  • loading data — 8
  • log — 25
  • log compaction — 14, 15
  • log sequence number — 13, 14
  • logical date — 24
  • logical decoding — 14
  • logical replication — 7
  • long-running transaction — 7
  • lookback window — 20
  • lsn — 14
  • lz4 — 11

M

  • making it a habit — 33
  • managed service — 5
  • manifest — 9, 10, 19, 27
  • margin — 25
  • mart — 19
  • masking and row-level security — 31
  • materiality — 38
  • materialization — 8, 18, 19, 32
  • materialized view — 8, 29, 36
  • measuring the rotation itself — 26
  • measuring: kestrel's clickstream — 11
  • medallion architecture — 34
  • memory and cost — 25
  • memory is the number that decides — 22
  • memory multiplier — 22
  • memory, and the four ways a job runs out of it — 21
  • mentorship — 40
  • merge — 20
  • merge-on-read — 10
  • metadata — 30
  • metric — 25
  • metric definition — 30
  • metrics, logs, and traces — 25
  • micro-batch — 3, 29
  • micro-partition — 8
  • microbatch — 20
  • migration — 27
  • minio — 5
  • ml infrastructure — 40
  • model registry — 32
  • modeling kestrel — 6
  • modern data stack — 5
  • module — 28
  • money is integer cents — 7
  • monitoring — 25
  • monitoring a cdc pipeline — 14
  • monitoring a model is monitoring data — 32
  • monitoring the consumers — 25
  • multi-stage build — 28
  • multipart upload — 9
  • mvcc — 7
  • mvcc and the long-running transaction — 7

N

  • narrow and wide — 21
  • narrow transformation — 21
  • natural key — 6
  • negotiating with the source team — 13
  • nested data, and when to flatten — 11
  • nested partitioning — 9
  • net revenue — 38
  • nine rules a build can enforce — 34
  • node selection — 19
  • non-additive measure — 6
  • non-determinism — 37
  • normalization — 6
  • normalization, and why analytics undoes it — 6
  • nullable dtype — 22
  • numbers — 1
  • numeric type — 7

O

  • oauth — 16
  • object dtype — 22
  • object storage — 9
  • object storage is not a filesystem — 9
  • observability — 25
  • observability tool — 5
  • offer negotiation — 39
  • offline store — 32
  • offset — 15
  • offset pagination — 16
  • oidc — 27, 28
  • oltp — 7
  • on-demand pricing — 8, 33
  • one definition of a metric — 30
  • online and offline stores — 32
  • online inference — 32
  • online store — 32
  • onsite loop — 39
  • opentelemetry — 25
  • operating a replication slot — 14
  • operating a streaming pipeline — 29
  • operating cdc alongside the batch extract — 14
  • operating kafka — 15
  • operator — 24, 28
  • optimistic concurrency — 10
  • orc — 11
  • orchestration — 1, 2
  • orchestrator — 5
  • ordering — 4, 14
  • ordering guarantee — 36
  • ordering: which projections actually care? — 36
  • out-of-core — 22
  • output port — 35
  • ownership — 17, 23, 30

P

  • pacelc — 4
  • pacelc, which is the useful version — 4
  • packages, and the four worth having — 19
  • page — 7, 9
  • page token — 16
  • pages and the heap — 7
  • pagination — 16
  • paging — 26
  • pandas — 22
  • pandas' four structural problems — 22
  • parallel run — 37
  • parallelism and throughput — 13
  • parquet — 9, 11
  • parquet and orc: columnar — 11
  • part vi ends here — 33
  • part vii ends here — 37
  • partial failure — 4
  • partial failure, and why it changes everything — 4
  • partition — 15, 21
  • partition alignment — 20
  • partition assignment — 15
  • partition by — 18
  • partition key — 4, 12, 36
  • partition pruning — 1, 9, 21, 33
  • partition size — 4
  • partitioning — 4, 8
  • partitioning in object storage — 9
  • partitions: the number that decides everything — 21
  • periodic snapshot — 6
  • personal data — 31
  • personal data in non-production environments — 31
  • physical replication — 7
  • pii — 31
  • pivot — 18
  • pivot, portably — 18
  • pivoting and unpivoting — 18
  • plan — 28
  • platform engineering — 40
  • platform team — 35
  • point-in-time correctness — 32
  • polars — 22
  • polars: expressions and laziness — 22
  • poll loop — 15
  • polyglot persistence — 12
  • polyseme — 35
  • pool — 24
  • portfolio — 40
  • portfolio project — 39
  • postgresql, mysql, and the rest — 7
  • practical properties — 9
  • pre-authorization — 26
  • predicate pushdown — 8, 21, 22, 33
  • predicate pushdown and row groups — 8
  • prefix — 9
  • prefixes — 9
  • presenting the capstone — 39
  • privacy as a pipeline stage, not a review — 31
  • processing time — 4, 29
  • processor — 31
  • producer — 15
  • producer-side validation — 17
  • producers — 15
  • profiles.yml — 19
  • progressive refinement — 34
  • project layout, and why the boring one wins — 19
  • projection — 36
  • projection pushdown — 8, 22
  • promotion — 27, 40
  • protocol buffers — 11
  • provider — 28
  • pseudonymization — 31
  • publication — 14
  • purpose limitation — 31

Q

  • qualify — 18
  • quarantine — 23, 34
  • quarantine: where bad rows live — 34
  • quasi-identifier — 31
  • query plan — 7, 22
  • querying a lake — 9
  • quorum — 4

R

  • rank — 18
  • rank by payoff, not by size — 33
  • rate limit — 16
  • rate limits — 16
  • raw zone — 34
  • rbac — 30
  • rdd — 21
  • re-identification — 31
  • read replica — 7
  • read-your-writes — 4
  • reading a query plan — 7
  • reading a rejection — 39
  • reading a transformation's plan — 18
  • reading files is where it actually breaks — 22
  • reading the limit — 16
  • reading the log to debug — 36
  • reading the table — 10
  • rebalance — 15
  • rebalancing — 15
  • rebuild — 38
  • reconciliation — 13, 37, 38
  • reconciling: what "the same" means — 37
  • recursive cte — 18
  • recursive ctes — 18
  • red flag — 39
  • redshift — 8
  • ref — 19
  • referential integrity — 23
  • refund netting — 38
  • relevance scoring — 12
  • repartition — 21
  • replay — 29, 34
  • replay window — 16
  • replication — 4
  • replication factor — 15
  • replication lag — 4
  • replication slot — 7, 14
  • replication, and which kind cdc needs — 7
  • reserved instances — 33
  • residency: where the bytes physically are — 31
  • respecting it proactively — 16
  • rest api — 16
  • restartability — 13
  • restartable, and why that is not idempotent — 13
  • result cache — 8
  • retention — 10, 15, 30, 31
  • retention and compaction — 15
  • retention and deletion — 30
  • retention: how long to keep what — 25
  • retention: the log that cannot be forever — 36
  • retroactive change — 16
  • retryable error — 16
  • revenue recognition — 38
  • reverse etl — 2, 5
  • reverse etl, and the loop that closes — 2
  • reverse interview — 39
  • reversible decision — 3
  • review date — 3
  • reviewing a data change — 27
  • right to be forgotten — 31
  • role explosion — 30
  • role-playing dimension — 6
  • rollback — 27, 37
  • rollback, and what cannot be rolled back — 27
  • rotation — 26
  • rotation design — 26
  • routing — 25
  • row group — 8, 9
  • row-binary format — 11
  • row-level deletes and updates — 10
  • row-level security — 31
  • row-oriented storage — 7
  • row_number — 18
  • rows versus range — 18
  • rows versus range — the bug — 18
  • run-length encoding — 8
  • runbook — 25, 26, 38
  • running an incident — 26

S

  • salting — 21
  • salting, and the other skew fixes — 21
  • sampling — 27
  • savings plan — 33
  • scan cost — 11
  • scd type 1 — 20
  • scd type 2 — 20
  • scd2 mechanics, and three invariants — 20
  • scheduler — 24
  • schema change event — 14
  • schema changes in a stream — 14
  • schema drift — 13, 25
  • schema enforcement — 10
  • schema enforcement and evolution — 10
  • schema evolution — 9, 10, 17, 36
  • schema evolution and replay — 36
  • schema registry — 11, 15, 17
  • schema-on-read — 11
  • schema-on-read versus schema-on-write — 11
  • schema-on-write — 11
  • schemas and the registry — 15
  • scope — 39, 40
  • scoring a team from outside — 40
  • search engines — 12
  • search index — 12
  • secondary index — 12
  • secret — 27
  • secret manager — 28
  • secrets — 27
  • security — 2
  • seed — 19
  • seeding kestrel — 7
  • self-serve data platform — 35
  • semantic layer — 2, 5, 30
  • semantic versioning — 17
  • semi-additive measure — 6
  • semi-structured data — 7
  • sensitivity tier — 30
  • sensor — 24
  • sensors, deferrable operators, and datasets — 24
  • sequence number — 36
  • sequential scan — 7
  • serialization — 11
  • serve — 2
  • serve: the only stage the business sees — 2
  • service level agreement — 17
  • session window — 29
  • sessionization — 18
  • set-based thinking — 18
  • settingwithcopywarning — 22
  • seven wastes, sized — 33
  • severity — 23, 26
  • shadow and blue-green for models — 27
  • shadow deploy — 27
  • shadow running — 37
  • shadow schema — 17
  • sharding — 12
  • showback — 33
  • shuffle — 21
  • signal — 39
  • silver layer — 34
  • silver: typed, deduplicated, conformed — 34
  • singular test — 19
  • sizing partitions — 15
  • skew — 4, 21
  • skew is the failure mode — 4
  • skew: the failure that looks like slowness — 21
  • sla — 1, 25, 26
  • sla miss — 24
  • sla, slo, sli — 26
  • sli — 26
  • sliding window — 29
  • slim ci — 19, 27
  • slim ci in practice — 27
  • slim ci, and what it costs not to have it — 19
  • slo — 25, 26
  • slot — 8, 33
  • slowly changing dimension — 20
  • slowly changing dimensions — 6
  • slowly changing dimensions, honestly — 20
  • small file problem — 33
  • small files problem — 9, 21
  • snappy — 11
  • snapshot — 7, 10, 14, 19, 20
  • snowflake — 8
  • snowflake schema — 6
  • snowflake, bigquery, redshift — 8
  • soft delete — 13
  • software engineering — 2
  • sort key — 12
  • sort order — 11
  • sort-merge join — 21
  • source — 19
  • source fidelity — 34
  • source freshness — 19
  • source of truth — 1, 38
  • source system — 2
  • specialization — 40
  • spill — 8, 21
  • splittable — 11
  • splitting state, and blast radius — 28
  • spot instances — 33
  • sql round — 39
  • staff engineer — 40
  • stage — 21
  • staging — 27, 34
  • staging model — 19
  • star — 39
  • star and snowflake — 6
  • star schema — 6
  • starting from nothing: the first ninety days — 17
  • state comparison — 27
  • state file — 28
  • state is a fold — 36
  • state store — 29
  • state, and what it costs — 29
  • statement timeout — 7
  • statsd — 25
  • staying current without chasing everything — 40
  • step 1 — select the business process — 6
  • step 2 — declare the grain — 6
  • step 3 — identify the dimensions — 6
  • step 4 — identify the facts — 6
  • steward — 30
  • storage class — 9, 33
  • storage-compute separation — 8
  • store — 2
  • store: the substrate, not a stage — 2
  • stored procedure — 37
  • strangler fig — 37
  • strategy 1 — overwrite the partition — 20
  • strategy 2 — merge on a unique key — 20
  • strategy 4 — build aside and swap — 20
  • stream processing — 3
  • streaming — 29
  • streaming execution — 22
  • structure: recovering from the middle — 24
  • structured logging — 25
  • subject access request — 31
  • surrogate key — 6, 20
  • surrogate keys — 6
  • synthetic data — 27
  • system design interview — 39
  • system design: what is actually scored — 39

T

  • table format — 10
  • tagging — 28, 33
  • take the inventory before you read anything — 37
  • take-home — 39
  • target — 19
  • target leakage — 32
  • task — 21, 24
  • task group — 24
  • taskflow api — 24
  • technical currency — 40
  • technical debt — 37
  • technical metadata — 30
  • technical screen — 39
  • telemetry — 25
  • telling another team what they cost — 33
  • terminal error — 16
  • terraform — 28
  • terraform: state, plan, apply — 28
  • testing a dag — 24
  • testing a python transformation — 22
  • testing a streaming job — 29
  • testing against an api you do not control — 16
  • testing and tuning an incremental model — 20
  • testing infrastructure — 28
  • testing the data — 23
  • testing the pipeline — 23
  • testing the pipeline versus testing the data — 23
  • testing without production data — 27
  • tests belong at different layers — 34
  • tests: the feature that justifies the tool — 19
  • text formats — 11
  • the "do without" column — 5
  • the acceptance criterion — 1
  • the access request: export, not delete — 31
  • the assembly — 38
  • the behavioral round — 39
  • the big data era (2005–2015) — 1
  • the boundary — 28
  • the boundary people draw in the wrong place — 2
  • the build that must not be slow — 27
  • the bus matrix — 6
  • the bus matrix, condensed — 6
  • the business, in numbers — 1
  • the buy/build table, category by category — 5
  • the calculation — 15
  • the catalog — 30
  • the comparison — 10
  • the comparison that matters — 3, 8
  • the correctness round — 39
  • the csv that somebody made — 1
  • the dba era (1980s–1990s) — 1
  • the decision — 12
  • the decision, honestly framed — 5
  • the definitions that had to be resolved — 6
  • the differences, and who is wrong — 37
  • the dimensions — 6
  • the dual write — 36
  • the eight categories — 5
  • the eight common mistakes — 6
  • the eight fallacies, compressed — 4
  • the envelope — 14
  • the etl era (1990s–2000s) — 1
  • the fact tables — 6
  • the failure — 7
  • the failure modes you will actually meet — 4
  • the first ninety days in a data role — 40
  • the five change-detection strategies — 13
  • the five stages, in one sentence each — 2
  • the four controls to set on day one — 8
  • the four controls, and all four are required — 14
  • the four kinds, and what each costs — 37
  • the four pagination shapes — 16
  • the four principles, stated fairly — 35
  • the four rules — 38
  • the four ways people leave — 40
  • the four ways updated_at lies — 13
  • the four-step design process — 6
  • the frame clause — 18
  • the functions you will actually use — 18
  • the general form — 18
  • the goal — 1
  • the initial snapshot — 14
  • the job nobody owns and nobody can read — 37
  • the kestrel carrier ingester — 16
  • the kestrel cdc pipeline — 14
  • the kestrel clickstream pipeline — 15
  • the kestrel dbt project — 19
  • the kestrel extractor — 13
  • the kestrel local stack — 5
  • the kestrel orders contract — 17
  • the kestrel platform — 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 36, 37
  • the kestrel silver models — 18
  • the last thing — 40
  • the layers of transformation — 2
  • the layout — 8
  • the levels — 40
  • the margin — 25
  • the migration that should not happen — 37
  • the model is a select statement — 19
  • the model: dag, task, operator, executor — 24
  • the modern era (2015–now) — 1
  • the month — 38
  • the myth — 18
  • the new shape — 8
  • the nine formats, placed — 11
  • the old shape — 8
  • the one dashboard — 25
  • the one honest reason to add a store — 12
  • the optimizations that actually matter — 33
  • the order — 37
  • the other three reconciliations — 38
  • the out-of-core question — 22
  • the partition key decides everything — 15
  • the pattern that gets people into trouble — 10
  • the picture — 2, 3
  • the pipeline, ordered by yield — 27
  • the political problem — 37
  • the postmortem — 26
  • the pre-flight estimate — 33
  • the primitive: put-if-absent — 10
  • the principles that survive — 3
  • the privacy case — 10
  • the problem it solves — 35
  • the problem, stated precisely — 17
  • the question — 25
  • the questions you ask them — 39
  • the reconciliation — 38
  • the regulations as technical requirements — 31
  • the retroactive projection — 36
  • the rules that generalize — 15
  • the runbook — 26
  • the same workload, three meters — 33
  • the scan-cost argument — 11
  • the schema registry — 17
  • the self-serve platform — 35
  • the separation of storage and compute — 8
  • the seven patterns — 6
  • the shape of a batch extract — 13
  • the shape of the loop — 39
  • the six artifacts — 1
  • the six assertions that earn their keep — 23
  • the six dimensions, and which you can test — 23
  • the six undercurrents — 2
  • the small files problem — 9
  • the social half — 17
  • the source side — 38
  • the specializations — 40
  • the spectrum — 29
  • the spectrum, honestly — 3
  • the sql round — 39
  • the storm — 15
  • the strangler fig — 37
  • the systems — 1
  • the take-home, and whether to do it — 39
  • the team and the constraint — 1
  • the technique — 18
  • the term is a problem — 5
  • the three approaches — 14
  • the three conditions that decide it — 13
  • the three kinds of cdc — 14
  • the three mistakes — 11
  • the three properties of a safe watermark — 13
  • the three questions — 20
  • the three questions that decide it — 3
  • the three schemes — 4
  • the three shapes that give it away — 18
  • the three things it is genuinely good for — 10
  • the three types — 6
  • the transaction log — 10
  • the transformation that will bite you — 2
  • the transition that matters — 40
  • the two heartbeats — 15
  • the two ideas worth stealing — 35
  • the two models, and what each rewards — 8
  • the two questions — 11
  • the two things it is not — 10
  • the two ways to be wrong — 3
  • the word "pipeline" hides the work — 1
  • there is no global clock — 4
  • third normal form — 6
  • threads — 19
  • three things called "event-driven — 36
  • threshold — 23
  • throughput — 3
  • thundering herd — 16
  • time travel — 10
  • time, clocks, and ordering — 4
  • time-series database — 12
  • time-series databases — 12
  • timeline — 26
  • timeliness — 23
  • timestamp strategy — 20
  • timestamp with time zone — 7
  • toil — 26, 40
  • token bucket — 16
  • token refresh — 16
  • tokenization — 31
  • tombstone — 10, 13, 14, 15
  • tools — 1
  • topic — 15
  • topics, partitions, and offsets — 15
  • total cost of ownership — 5
  • trace — 25
  • trailing median — 25
  • training/serving skew — 32
  • transaction boundary — 14
  • transaction isolation — 7
  • transaction log — 10
  • transactional outbox — 36
  • transactional sink — 29
  • transform — 2
  • transform: making it mean something — 2
  • transformation framework — 5
  • transitive compatibility — 17
  • trigger — 24
  • ttl — 12
  • tumbling window — 29
  • two incidents that frame this book — 1
  • types and nulls: where the three disagree — 22
  • types that matter — 7

U

  • udfs: the cost that is not in the plan — 21
  • undercurrent — 2
  • undocumented dependency — 37
  • uniqueness — 23
  • unit economics — 33
  • unit economics: cost per thing — 33
  • unit test — 19, 27
  • unknown member — 19, 20
  • unpivot — 18
  • unplanned work — 40
  • upcasting — 36
  • updated_at — 13
  • upsert — 20

V

  • vacuum — 7, 10
  • valid_from — 20
  • valid_to — 20
  • validity — 23
  • vector database — 12
  • vector databases — 12
  • vectorization — 22
  • vendor lock-in — 5
  • verification — 37, 38
  • verify by rebuilding — 38
  • version note and the alternatives — 24
  • versioning — 17
  • versioning three things — 27
  • virtual warehouse — 8, 33
  • volume — 25
  • volume floor — 23

W

  • warehouse versus lake versus lakehouse — 3
  • watermark — 2, 13, 20, 29
  • webhooks — 16
  • what "production-grade" means here — 1
  • what a contract contains — 17
  • what a data deploy actually is — 27
  • what a data engineer should and should not own — 32
  • what a feature is — 32
  • what a lakehouse still does not give you — 10
  • what a slot guarantees, and what that costs — 14
  • what a table format actually adds — 10
  • what a test costs — 23
  • what an event is — 36
  • what an ml team actually needs from you — 32
  • what analytics needs instead — 6
  • what architecture actually decides — 3
  • what belongs in the orchestrator — 24
  • what cap actually says — 4
  • what cdc solves that batch cannot — 14
  • what changed, and why it was economics — 3
  • what data engineering is not — 1
  • what dbt actually is — 19
  • what duckdb demonstrates faithfully — 8
  • what duckdb does not show you — 8
  • what each mode permits — 17
  • what each one actually is — 22
  • what happens — 15
  • what happens to a bad row — 23
  • what is in a commit — 10
  • what is on disk — 10
  • what it buys, quantified — 8
  • what it costs — 9, 35, 36
  • what it costs and how long it takes — 38
  • what it does not — 8
  • what it does not add — 10
  • what it is not — 17
  • what kafka actually is — 15
  • what latency is actually required — 29
  • what makes a data team good to work on — 40
  • what makes a warehouse different — 8
  • what makes it someone else's — 38
  • what normalization optimizes — 6
  • what pages, and what does not — 26
  • what reproducibility buys — 28
  • what staff actually is — 40
  • what storage decisions you actually own — 2
  • what streaming actually costs — 3
  • what the job actually is — 1, 40
  • what the layers are actually for — 34
  • what the layers buy: replay — 34
  • what the log actually contains — 14
  • what the on-call engineer may decide alone — 26
  • what the overlap costs — 37
  • what the pattern costs — 34
  • what the quality register caught — 38
  • what they are actually screening for — 39
  • what this book uses, and why — 5
  • what went wrong, honestly — 38
  • what would reverse this — 3
  • what you can safely leave out — 5
  • what you have built — 38
  • what you need to know about a source system — 2
  • what you would do differently — 38
  • when contracts are not worth it — 17
  • when cron stops working — 24
  • when governance is imposed — 30
  • when it is right — 35
  • when not to — 36
  • when not to use cdc — 14
  • when not to use it — 34
  • when streaming is actually right — 29
  • when you cannot fix it tonight — 26
  • when you find something bad — 31
  • when you need none of this — 5
  • where a credential comes from — 28
  • where a test lives — 23
  • where etl is still right — 3
  • where the boundaries actually fall — 34
  • where the discipline came from — 1
  • where the money actually goes — 8
  • where the money actually is — 33
  • where the schema lives — 11
  • which errors to retry — 16
  • whose test is it? — 23
  • why a lifecycle and not a tool list — 2
  • why a platform ends up with six databases — 12
  • why bad data is worse than no data — 23
  • why it happens — 9
  • why it has a bad reputation — 30
  • why keep raw when you have cleaned data — 9
  • why model at all — 6
  • why select is both right and wrong here — 13
  • why this is a data engineering problem — 12
  • why this is hard, and it is not the code — 37
  • wide transformation — 21
  • wide-column store — 12
  • wide-column stores — 12
  • window function — 18
  • window functions — 18
  • windowing — 29
  • worker — 24
  • workload identity — 28
  • workspace — 28
  • write-ahead log — 14
  • writing an as-of join — 32

X

  • xcom — 24
  • xcom, and what not to put in it — 24

Y

  • you are a guest — 7

Z

  • z-ordering — 10
  • zero-copy — 22
  • zone map — 8
  • zstd — 11

1336 index entries across 40 chapters.