analyzing-schema-change-storage-risk
Estimates storage requirements for CockroachDB online schema change backfills using SHOW RANGES WITH DETAILS, KEYS, INDEXES. Use before CREATE INDEX, ADD COLUMN with INDEX/UNIQUE, ALTER PRIMARY KEY, CREATE MATERIALIZED VIEW, CREATE TABLE AS, REFRESH, or SET LOCALITY on tables with large per-index footprints, to avoid mid-backfill disk exhaustion.
What this skill does
# Analyzing Schema Change Storage Risk Estimates the storage headroom needed to safely run online schema changes. Mirrors the [official guidance](https://www.cockroachlabs.com/docs/stable/online-schema-changes#estimate-your-storage-capacity-before-performing-online-schema-changes): some operations may temporarily require up to **3× the size of the affected table or index** while the schema change is in flight. For ongoing range-distribution monitoring, see [analyzing-range-distribution](../analyzing-range-distribution/SKILL.md). ## When to Use This Skill Run a quick estimate before issuing any of these operations on a table whose indexes are large (multiple GB per index, or many ranges per index): - `CREATE INDEX` - `ADD COLUMN` with `INDEX` or `UNIQUE` - `ALTER PRIMARY KEY` - `CREATE MATERIALIZED VIEW` - `CREATE TABLE AS` - `REFRESH MATERIALIZED VIEW` - `ALTER TABLE ... SET LOCALITY` (when the locality change rewrites data) Tables whose indexes are small (kilobytes to a few megabytes) carry trivial storage risk; estimation is unnecessary. ## Background ### How much temporary space does a backfill actually need? The honest answer depends on the operation: - **`CREATE INDEX` / `ADD COLUMN ... UNIQUE`**: needs roughly **1× the size of the new index** — the indexed columns plus the primary key columns, written into a fresh index span. This is typically a small fraction of the table. Worst-case headroom is bounded by the size of that one index. - **`ALTER PRIMARY KEY`**: rewrites the primary index and any secondary indexes whose definitions depend on the old PK. Old data sticks around until GC, so peak on-disk usage during the change can approach the size of the table again. - **All bulk-ingest backfills**: extra MVCC versions and pre-compaction SSTs add overhead until Pebble compacts and GC runs. The official docs round these up into a single conservative recommendation: plan for up to **3× the size of the affected table or index** as free space. That figure is a safety bound, not a precise prediction. For most `CREATE INDEX` operations the real cost is much smaller; for `ALTER PRIMARY KEY` on a large table it is the right ballpark. ### What happens if the cluster runs out of disk mid-backfill? Backfills bulk-ingest data via `AddSSTable`, which checks the per-store remaining capacity before each ingestion. If the remaining fraction falls below `kv.bulk_io_write.min_capacity_remaining_fraction` (default `0.05`, i.e. 5%), the ingest is rejected with `InsufficientSpaceError`. Both the legacy and declarative schema changers translate that error into a job pause request, so the schema change halts rather than wedging the cluster. To resume, free space (e.g. drop unused indexes, expand storage) and resume the paused job. This is a *reactive* safety net, not a planning tool — by the time it fires, foreground writes on the affected store may already be unhealthy. ## Estimating Capacity ### Step 1 — Check free space per store The minimum free space across stores is what bounds the schema change, not the total cluster free space (replicas are spread across nodes). No production-safe SQL view exposes per-store capacity. Use the DB Console **Overview** → **Storage** page (sorts per-store usage), or scrape the per-node Prometheus endpoint and look at the smallest `capacity_available`: ```bash curl -ks https://<node>:8080/_status/vars | grep -E '^capacity( |_used|_available)' ``` ### Step 2 — Estimate the affected table/index size Use the docs-recommended form of `SHOW RANGES`: ```sql SHOW RANGES FROM TABLE <table> WITH DETAILS, KEYS, INDEXES; ``` The output includes one row per range, with `range_size_mb` and `index_name`. Aggregate by index for the per-index totals that matter for capacity planning: ```sql WITH r AS (SHOW RANGES FROM TABLE <table> WITH DETAILS, KEYS, INDEXES) SELECT index_name, COUNT(*) AS range_count, ROUND(SUM(range_size_mb), 2) AS index_size_mb, ROUND(SUM(range_size_mb) / 1024, 2) AS index_size_gb FROM r GROUP BY index_name ORDER BY index_size_mb DESC; ``` ### Step 3 — Compare against the operation | Operation | Conservative free-space target (per store) | |---------------------------------------------|-----------------------------------------------------------------------------| | `CREATE INDEX` / `ADD COLUMN ... UNIQUE` | Up to 3× the size of the *new* index (its indexed + PK columns). | | `ALTER PRIMARY KEY` | Up to 3× the size of the *table* (sum of the relevant indexes from step 2). | | `CREATE MATERIALIZED VIEW` / `CREATE TABLE AS` | Up to 3× the expected size of the materialized result. | The new index does not exist yet, so estimate it from a comparable existing index (e.g. one on similarly typed columns) or from the source columns' contribution to the primary index. If the smallest free-space figure from step 1 is well above the target, the operation is safe to run. If it is close, free space first (drop unused indexes, expand storage) before issuing the DDL. ## Operational Notes - **`SHOW RANGES ... WITH DETAILS` is expensive.** It computes span statistics on demand. Always target a specific table, never run it cluster-wide, and prefer maintenance windows on tables with thousands of ranges. - **Watch the job, not just disk.** If a backfill pauses with `InsufficientSpaceError`, free disk on the affected store and resume the paused schema change job. Check with: ```sql WITH j AS (SHOW JOBS) SELECT job_id, status, error FROM j WHERE job_type = 'SCHEMA CHANGE' AND status = 'paused'; ``` - **Drop unused indexes first.** Often the cheapest way to free headroom before a large backfill is to drop indexes that `crdb_internal.index_usage_statistics` shows are unused (this is one of the 12 production-safe `crdb_internal` views, per the [docs](https://www.cockroachlabs.com/docs/stable/crdb-internal)). - **Statistics lag.** `range_size_mb` is approximate and can lag actual disk usage; treat estimates as conservative ballparks, not exact figures. ## References - [Online Schema Changes — Estimate your storage capacity](https://www.cockroachlabs.com/docs/stable/online-schema-changes#estimate-your-storage-capacity-before-performing-online-schema-changes) - [SHOW RANGES](https://www.cockroachlabs.com/docs/stable/show-ranges.html) ## Related Skills - [analyzing-range-distribution](../analyzing-range-distribution/SKILL.md) — range count, leaseholder placement, fragmentation
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.