Release 2.28.0#10010
Merged
Merged
Conversation
Member
|
Needs to mention this is last version with PG15 support |
89b015b to
4b34840
Compare
7 tasks
svenklemm
reviewed
Jun 13, 2026
e7a0124 to
4c9a0c6
Compare
Co-authored-by: Anastasiia Tovpeko <114177030+atovpeko@users.noreply.github.com> Signed-off-by: Philip Krauss <35487337+philkra@users.noreply.github.com>
1be149e to
bc8a61d
Compare
surister
approved these changes
Jun 15, 2026
svenklemm
approved these changes
Jun 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
2.28.0 (2026-06-16)
This release contains performance improvements and bug fixes since the 2.27.2 release. We recommend that you upgrade at the next available opportunity.
Highlighted features in TimescaleDB v2.28.0
first()andlast()queries on compressed data. TimescaleDB derivesfirst(value, time)andlast(value, time)aggregates straight from the columnstore's batch metadata, skipping batch decompression entirely. For the "latest reading per series" lookups that time-series workloads run constantly, that means meaningfully faster recency queries with no changes to your SQL queries.refresh_continuous_aggregate()can now run incrementally in batches — the same behavior refresh policies already use — enabling breaking large manual refreshes into smaller chunks (tunable viabuckets_per_batch,max_batches_per_execution, andrefresh_newest_first) instead of one heavy operation. Refreshes also now take a lighter lock while processing the invalidation log, so they no longer block unrelated concurrent operations on the same continuous aggregate, improving behavior for concurrent workloads.CASEexpressions. TimescaleDB's columnar executor can now evaluateCASE ... WHENexpressions directly on compressed data, so queries using conditional logic stay on the fast vectorized path instead of falling back to slower row-by-row decompression. This speeds up a common pattern — conditional aggregations and computed columns over compressed history — with no query changes needed.ALTER MATERIALIZED VIEW <cagg> ADD COLUMN <name> <type> GENERATED ALWAYS AS (<aggregate>) STOREDto add a new computed aggregate to an existing continuous aggregate in place — no more dropping and recreating the whole aggregate just to track one more metric. New data populates the column going forward, letting your rollups evolve alongside your application. (Existing rows start asNULL; a forced refresh backfills them when you need historical values.)Deprecation Notice: PostgreSQL 15 Support
This release marks the final minor version of TimescaleDB that will support PostgreSQL 15. Starting with our next release, version 2.29.0, we will officially drop support for Postgres 15, and only support Postgres 16, 17, and 18; however, all future patch releases within the current 2.28 version cycle will continue to fully support it. We recommend planning your PostgreSQL upgrades accordingly to ensure a smooth transition.
Deprecation Notice:
chunk_constraintCatalog TablePlease note that the
_timescaledb_catalog.chunk_constrainttable has been dropped and temporarily replaced by a view, which introduces a change to the underlying objects while maintaining current query behavior. However, this compatibility view will be completely removed in a future release. To ensure your queries remain compatible moving forward, we strongly advise transitioning to the stable contracts provided by our informational views.Backward-Incompatible Changes
Features
ANALYZEandVACUUMon continuous aggregates by redirecting to the underlying materialization hypertableSELECTqueries over compressed hypertables to approximately match the uncompressed data sizehypertableandchunkas user catalog tablesCASEexpression in columnar aggregation and groupingfirst/lastsparse indexes to compressionfirst/lastsparse index fororderbymetadata on new compressed chunksGapFillrow count estimateADD COLUMNon continuous aggregateschunk_constraintcatalog tracking for foreign keyschunk_constraintcatalog tracking for non-dimensional constraintsrefresh_continuous_aggregate()_timescaledb_catalog.chunk_constrainttablerebuild_sparse_indexfunctionfirst/last(value, time)inColumnarIndexScanBugfixes
timestamptzvalueCOPY WHEREinto a hypertable with dropped columnsColumnarScanALTER TABLE ... INHERITwhen the parent is a hypertableNOT VALID NOT NULLconstraint for query optimizationMERGE WHEN NOT MATCHED BY SOURCEon hypertablestime_bucket_gapfillfunction detectionapproximate_row_counthandling of InfinityPG_INT64_MAXNew Settings
skip_cagg_invalidation: skip continuous aggregate invalidation tracking for DML and DDL in the current session/transaction. Off by default.stats_max_chunks: set the per-database compressed chunk statistics cache capacity. Defaults to 1024 chunks; set to 0 to disable the feature.Thanks