You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: META.json
+4-4Lines changed: 4 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -1,19 +1,19 @@
1
1
{
2
2
"name": "storage_engine",
3
3
"abstract": "Columnar (colcompress) and row-compressed (rowcompress) Table AMs for PostgreSQL with vectorized aggregation, parallel scan, and zone-map pruning",
4
-
"description": "storage_engine v2.3 expands the vectorized aggregate path (StorageEngineVectorAgg) with sum(expression) support — sum(col OP col), sum(col + const), sum(col::numeric OP col) — via VECGAGG_SUM_EXPR, and post-aggregation projection arithmetic via VECGAGG_MULTI_EXPR (e.g. sum(a) + count(*)). avg(int8) in parallel plans is now correct. Multiple SIGSEGV crash fixes were applied to the planner hook and aggregate executor. Both AMs are validated on PostgreSQL 15–19 (PG15: 293 tests; PG16–PG19: 292 tests each). All catalog objects live in the engine schema; C symbols use the se_ prefix.",
5
-
"version": "2.3.0",
4
+
"description": "storage_engine v2.4 improves real TPC-H planning for colcompress with narrow planner-hook fixes for Q7, Q18, Q20, and Q21 plus nested-loop avoidance for post-join aggregate shapes such as Q9 on PG16+. rowcompress index lookups now expose reliable scan/cache counters through engine.rowcompress_scan_stats() and reuse backend-local metadata plus decompressed batches safely across repeated probes. colcompress keeps its page cache alive across rereads in the same backend, improving repeated-scan latency without query rewrites. The extension is validated on PostgreSQL 15–19 (PG15: 294 tests; PG16–PG18: 293 tests each; PG19: 297 tests). All catalog objects live in the engine schema; C symbols use the se_ prefix.",
5
+
"version": "2.4.0",
6
6
"release_status": "stable",
7
7
"maintainer": [
8
8
"Saulo José Benvenutti <saulojb@gmail.com>"
9
9
],
10
10
"license": "agpl_3",
11
11
"provides": {
12
12
"storage_engine": {
13
-
"abstract": "colcompress and rowcompress Table AMs with vectorized aggregation (v2.3), parallel scan, and zone-map pruning",
13
+
"abstract": "colcompress and rowcompress Table AMs with vectorized aggregation (v2.4), parallel scan, and zone-map pruning",
Copy file name to clipboardExpand all lines: README.md
+8-4Lines changed: 8 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# storage_engine
2
2
3
-
> **v2.2 — Storage Maintenance BGW + Incremental Merge + CREATE TABLE WITH(…)**`storage_engine` v2.2 adds a built-in maintenance Background Worker that automatically calls `engine.storage_maintenance_auto()` on a schedule, incremental merge procedures for both AMs (`colcompress_merge_incremental`, `rowcompress_merge_incremental`), a unified `engine.storage_health` view, and support for `CREATE TABLE … USING colcompress/rowcompress WITH (options)` syntax. Validated: **281/281 on PG 15, 280/280 on PG 16–19**.
3
+
> **v2.4 — TPC-H planner fixes + reread caches + PG15–PG19 validation**`storage_engine` v2.4 improves real `colcompress` performance with narrow planner-hook fixes for official TPC-H queries (`Q7`, `Q18`, `Q20`, `Q21`) and a targeted replan that avoids bad final nested loops for `Q9`-style post-join aggregates on PG16+. It also makes repeated reads measurably cheaper by keeping the `colcompress` page cache alive across scans in the same backend and by reusing `rowcompress` metadata/decompressed batches safely across repeated index probes, with observability through `engine.rowcompress_scan_stats()`. Validated: **294/294 on PG15, 293/293 on PG16–PG18, 297/297 on PG19**.
4
4
5
5
A PostgreSQL extension providing two high-performance Table Access Methods designed for analytical and HTAP workloads.
6
6
@@ -102,6 +102,8 @@ A scan only reads the columns referenced by the query, skipping all others entir
102
102
103
103
The AM maintains an in-memory **column cache** that stores decompressed column chunks across executor iterations. When the same stripe region is accessed more than once (nested loops, repeated plans, self-joins), the decompressed data is served from cache without re-reading or re-decompressing the file.
104
104
105
+
In v2.4, that cache remains alive for the backend across repeated scans instead of being dropped when the last scan ends, so reread-heavy workloads benefit without restarting the session or rewriting SQL.
106
+
105
107
```sql
106
108
SETstorage_engine.enable_column_cache=on; -- default: on
107
109
```
@@ -451,6 +453,8 @@ Compared to `colcompress`:
451
453
SET max_parallel_workers_per_gather =4;
452
454
```
453
455
456
+
For repeated point lookups, `rowcompress` also keeps backend-local metadata and reusable decompressed batches so index-driven probes do not need to rebuild batch state on every statement. Use `engine.rowcompress_scan_stats()` to inspect metadata cache hits/misses, batch cache hits/misses, and decompression counts for the current session.
457
+
454
458
### Per-Table Options
455
459
456
460
```sql
@@ -538,7 +542,7 @@ Reload with `SELECT pg_reload_conf()` after changing `maintenance_auto_*` GUCs
538
542
|`CALL engine.rowcompress_merge_incremental(regclass, max_batches)`| Rewrite only dirty batches (low-lock, incremental) |
539
543
|`engine.storage_maintenance_recommendation(regclass)`| Returns health metrics and `recommended_action` for a single table |
540
544
|`CALL engine.storage_maintenance_auto(dry_run, max_tables, am_filter, p_verbose)`| Dispatch merge/repack for all tables with pending maintenance |
|`engine.rowcompress_scan_stats()`| Session-local scan statistics for rowcompress tables, including metadata/batch cache hits, misses, and decompression counters|
0 commit comments