Columnar virtual tables
Create SQLite virtual tables whose columns are stored separately for analytical access patterns.
Embedded analytics
SQLite-Columnar adds a self-contained columnar storage and execution path to SQLite for analytical scans, grouped summaries, time-series rollups, and local dashboards.
SQLite-Columnar
SQLite-native extension
Best for
Embedded analytics
Repository
GitHubProject
SQLite-Columnar is a loadable extension that creates columnar virtual tables for analytical parts of an application while leaving SQLite's pager, btree, parser, VDBE, and shell untouched.
It stores each column separately, maintains stats and chunk metadata, and exposes specialized aggregation helpers for fast scans across wide datasets. On queries that can use columnar metadata and helpers, the included 10 million row variance benchmark reports speedups such as 130,583x faster `sum`, 125,194x faster `count`, and up to 273.20x faster clustered range filters with grouped aggregates.
Why it matters
Capabilities
Create SQLite virtual tables whose columns are stored separately for analytical access patterns.
Build and refresh per-column stats and chunk metadata only when data changes.
Run specialized sum, average, count, min, max, and grouped helpers over columnar data.
Skip rowid ranges that cannot match range filters after columnar metadata is analyzed.
Use table-valued helpers for grouped summaries without generic row materialization.
The 10 million row variance benchmark reports 130,583x faster `sum`, 129,317x faster `avg`, 125,194x faster `count`, and up to 273.20x faster clustered range filters with grouped aggregates.
Sample code
Load the extension, create a columnar virtual table, analyze it, and query fast aggregate helpers.
-- Load SQLite-Columnar
.load ./columnar
CREATE VIRTUAL TABLE sales USING columnar(
id INTEGER,
region TEXT,
category TEXT,
amount REAL,
cost REAL
);
INSERT INTO sales VALUES
(1, 'north', 'hardware', 10.0, 4.0),
(2, 'north', 'software', 20.0, 8.0),
(3, 'south', 'hardware', 5.0, 2.0);
SELECT columnar_analyze('sales');
SELECT columnar_sum('sales', 'amount');
SELECT k, "sum", "avg", "count"
FROM columnar_group_sum_avg_count('sales', 'region', 'amount')
ORDER BY k;