惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店
GitHub - rogerwelin/pg_column_tetris: A PostgreSQL extens...
rogerw · 2026-04-30 · via Hacker News: Show HN

PostgreSQL GitHub Actions Workflow Status License

A PostgreSQL extension that enforces optimal column alignment to minimize row padding waste.

pg_column_tetris logo

  • Warns on suboptimal CREATE TABLE statements during development
  • Enforces strict alignment in CI/CD pipelines
  • Audits existing tables and generates optimized migration scripts

Table of Contents

Why Column Order Matters

PostgreSQL stores each row as a sequence of bytes on disk. Column types have different sizes: a bigint takes 8 bytes, an integer takes 4, a boolean takes just 1. So far so simple.

The problem is that PostgreSQL can't just pack them back to back. The CPU reads memory most efficiently when values are naturally aligned; an 8-byte value should start at a position divisible by 8, a 4-byte value at a position divisible by 4, and so on. To guarantee this, PostgreSQL inserts invisible padding bytes between columns whenever needed.

Here's an example. Say you create a table like this:

CREATE TABLE bad_order (
    active    boolean,   -- 1 byte
    user_id   bigint,    -- 8 bytes
    age       integer    -- 4 bytes
);

In memory, each row looks like:

[active: 1B] [7B padding] [user_id: 8B] [age: 4B]  →  20 bytes of column data

user_id needs to start at an 8-byte boundary, so PostgreSQL pads 7 bytes after active to get there. That's 7 wasted bytes per row.

Now reorder the columns largest-first:

CREATE TABLE good_order (
    user_id   bigint,    -- 8 bytes
    age       integer,   -- 4 bytes
    active    boolean    -- 1 byte
);
[user_id: 8B] [age: 4B] [active: 1B]  →  13 bytes of column data

Zero padding. Same data, 35% smaller rows. Multiply that across millions of rows and dozens of columns and it will adds up fast. Optimal column order is free performance: zero runtime cost, just a smarter CREATE TABLE.

Alignment Groups

The extension sorts columns into these groups, largest alignment first:

  1. 8-byte aligned (d): bigint, timestamptz, float8, interval
  2. 4-byte aligned (i): integer, float4, date, oid
  3. 2-byte aligned (s): smallint
  4. 1-byte aligned (c): boolean, char(1)
  5. Variable-length (varlena): text, varchar, numeric, jsonb, bytea - always last

Within each group, NOT NULL columns come first (minor CPU optimization for tuple deforming).

Requirements

  • PostgreSQL 14+
  • Superuser or event trigger privileges (rds_superuser on RDS, cloudsqlsuperuser on Cloud SQL)

Installation

Pure SQL/PL/pgSQL - no C, no compilation.

Self-hosted PostgreSQL

make install
CREATE EXTENSION pg_column_tetris;

Managed services (RDS, Cloud SQL, Supabase, Neon, etc.)

Since there's no C code, the extension runs anywhere PostgreSQL does:

psql -d your_database -f pg_column_tetris--0.1.0.sql

Usage

The extension has three modes (warn, strict, off) that cover different workflows.

Warn mode (default) - catch bad ordering during development

The extension installs in warn mode. Any CREATE TABLE with suboptimal column order emits a NOTICE but still succeeds:

CREATE TABLE orders (
    is_shipped boolean,
    order_total numeric,
    user_id bigint,
    item_ct smallint,
    order_dt timestamptz,
    status smallint,
    ship_dt timestamptz
);
NOTICE: pg_column_tetris: suboptimal column alignment — 19 bytes of fixed-width padding wasted per row

Good for development — you see the problem without breaking anything.

Strict mode — enforce alignment in CI/migrations

In strict mode, CREATE TABLE with suboptimal column order is blocked and rolled back. The error message includes the optimal column order so you can fix it immediately:

SELECT column_tetris.set_mode('strict');

CREATE TABLE orders ( ... );
-- ERROR:  suboptimal column alignment — 19 bytes of fixed-width padding wasted per row
-- HINT:  Suggested order:
--     CREATE TABLE orders (
--         user_id bigint,          -- 8-byte aligned
--         order_dt timestamptz,    -- 8-byte aligned
--         ship_dt timestamptz,     -- 8-byte aligned
--         item_ct smallint,        -- 2-byte aligned
--         status smallint,         -- 2-byte aligned
--         is_shipped boolean,      -- 1-byte aligned
--         order_total numeric      -- varlena (last)
--     );

Use this in staging/production databases or CI pipelines to guarantee every new table has optimal alignment.

As an analysis tool - audit existing tables

Use padding_wasted() to quickly check how many bytes a table wastes per row:

SELECT column_tetris.padding_wasted('orders');
-- Returns: 7  (bytes of avoidable padding per row)

Pass 'total' to see the total waste across all rows in the table. Wrap with pg_size_pretty() for human-readable output:

SELECT pg_size_pretty(column_tetris.padding_wasted('orders', 'total'));
-- Returns: '458 MB'

Find all tables with padding waste:

SELECT schemaname, tablename,
       column_tetris.padding_wasted(schemaname || '.' || tablename) AS bytes_per_row
  FROM pg_tables
 WHERE schemaname = 'public'
   AND column_tetris.padding_wasted(schemaname || '.' || tablename) > 0;

Use check() for a detailed column-by-column layout report:

SELECT * FROM column_tetris.check('orders');

Use suggest_rewrite() to generate a migration script that reorders the columns optimally. Caution - it renames the original table, creates a new one, and copies all data. This means exclusive locks, downtime for that table, and lost foreign keys/indexes/triggers/defaults that aren't part of the generated DDL. Always review the output and test on a copy first:

SELECT column_tetris.suggest_rewrite('orders');
-- Generated output:
BEGIN;
ALTER TABLE public.orders RENAME TO orders_old;
CREATE TABLE public.orders ( ...optimal order... );
INSERT INTO public.orders SELECT ... FROM public.orders_old;
DROP TABLE public.orders_old;
COMMIT;

You can use off mode if you want to disable the event trigger entirely and just use the analysis functions.

Other configuration

-- Check current mode
SELECT column_tetris.mode();

-- Exclude a table from validation (e.g., matching an external schema)
SELECT column_tetris.exclude('legacy_imports');

-- View excluded table-/s
SELECT * FROM column_tetris.exclusions;

What gets checked

  • CREATE TABLE statements are validated by the event trigger
  • ALTER TABLE is deliberately skipped - you can't reorder existing columns, so warning would be noise
  • Temp tables and system schemas (pg_catalog, information_schema) are skipped
  • Tables in the exclusions list are skipped

License

MIT