The cost of a column

MO Mira Osei·26 June 2026·9 min read

Adding a column is the cheapest thing you can do in a schema migration and the most expensive thing you can do to a system. The statement takes milliseconds. Everything after it takes months.1

Start with storage. A nullable timestamp on a table of four hundred million rows costs roughly three gigabytes once you account for alignment padding, and another three in every replica. That is not the expensive part.

The expensive part is that the column now exists in seven years of backups, in the analytics mirror nobody remembers configuring, and in the export somebody built for the finance team in 2023.2 Removing it later requires finding all of them.

A column is not a field. It is a promise to keep something working for as long as the table exists.

None of this is an argument against adding columns. It is an argument for knowing what you are signing, and for writing the removal plan at the same time as the migration.

If your table is over a hundred million rows, do not add a default in the same statement. Postgres has rewritten the whole table for less.

Footnotes

  1. 1Measured across eleven migrations at three companies between 2021 and 2025. The median time from "add column" to "column fully removed" was 19 months. ↩
  2. 2Finance exports are the single most common reason a deprecated column cannot be dropped. Ask before you assume nobody reads it. ↩
  3. 3The alignment maths differs by engine; the shape of the argument does not. ↩
">

The prompt

Create a long-form article layout with Tailwind CSS that puts notes in the margin. Use a grid with a wide prose column and a narrow right column on xl screens, collapsing to a single column below where notes appear inline as bordered blocks instead. The prose has a title, a byline row, and four paragraphs at a comfortable measure with a superscript reference marker inside two of them. Each margin note is a small block with a matching superscript number, two lines of muted text, and one containing a link. Include a pull quote spanning both columns, and a bordered aside with a glyph for a caution. End with a footnotes section: a hairline, a small heading, and three numbered entries with back-links to the marker. Keep the type generous and the notes visually quieter than the body.

Paste it into Claude, Cursor, v0 or any AI coding tool. Prefer the finished markup? .