TigerData logo
TigerData logo
  • Product

    Product

    Tiger Cloud

    Robust elastic cloud platform for startups and enterprises

    TimescaleDB Enterprise

    Self-managed TimescaleDB for on-prem, edge and private cloud

    Open source

    TimescaleDB

    Time-series, real-time analytics and events on Postgres

    Search

    Vector and keyword search on Postgres

  • Industry

    Data Centers

    Energy & Utilities

    Oil & Gas Operations

    Smart Manufacturing

    Crypto

  • Docs
  • Pricing
  • Developer Hub

    Changelog

    Benchmarks

    Blog

    Community

    Customer Stories

    Events

    Support

    Integrations

    Launch Hub

  • Company

    About

    TigerData logo

    Timescale

    Partners

    Security

    Careers

Contact usStart a free trial
Home
What Is DCIM Software, and What Database Does It Use?Data Center Power Monitoring: The Database Layer Behind PUE, PDU, and Sustainability MetricsPrometheus Long-Term Storage: Thanos, Mimir, VictoriaMetrics, and PostgreSQL Compared
Time Series Forecasting with PostgreSQL: Methods, SQL Examples, and When to Use PythonThe Best Time-Series Databases Compared (2026)Time Series Anomaly Detection: Methods, SQL, and Real-Time ImplementationAWS Timestream Alternatives: Your Migration Options After LiveAnalyticsWhat Is Temporal Data?Time-Series Database: What It Is, How It Works, and When You Need OneIs Your Data Time Series? Data Types Supported by PostgreSQL and TimescaleUnderstanding Database Workloads: Variable, Bursty, and Uniform PatternsTime-Series Analysis and Forecasting With Python What Are Open-Source Time-Series Databases—Understanding Your OptionsStationary Time-Series AnalysisAlternatives to TimescaleWhy Consider Using PostgreSQL for Time-Series Data?Time-Series Analysis in RWhat Is a Time Series and How Is It Used?How to Work With Time Series in Python?Tools for Working With Time-Series Analysis in PythonGuide to Time-Series Analysis in PythonUnderstanding Autoregressive Time-Series ModelingCreating a Fast Time-Series Graph With Postgres Materialized Views
PostgreSQL vs. Cassandra: The Decision Framework for Time-Series and Write-Heavy WorkloadsUnderstanding PostgreSQLOptimizing Your Database: A Deep Dive into PostgreSQL Data TypesUnderstanding FROM in PostgreSQL (With Examples)How to Address ‘Error: Could Not Resize Shared Memory Segment’ Understanding FILTER in PostgreSQL (With Examples)How to Install PostgreSQL on MacOSUnderstanding GROUP BY in PostgreSQL (With Examples)Understanding LIMIT in PostgreSQL (With Examples)Understanding PostgreSQL FunctionsUnderstanding ORDER BY in PostgreSQL (With Examples)PostgreSQL Mathematical Functions: Enhancing Coding EfficiencyUnderstanding PostgreSQL WITHIN GROUPUnderstanding WINDOW in PostgreSQL (With Examples)Using PostgreSQL String Functions for Improved Data AnalysisUnderstanding DISTINCT in PostgreSQL (With Examples)PostgreSQL Joins : A SummaryUnderstanding PostgreSQL Date and Time FunctionsWhat Is a PostgreSQL Cross Join?Understanding ACID Compliance Understanding PostgreSQL Conditional FunctionsStructured vs. Semi-Structured vs. Unstructured Data in PostgreSQLUnderstanding percentile_cont() and percentile_disc() in PostgreSQL5 Common Connection Errors in PostgreSQL and How to Solve ThemData Processing With PostgreSQL Window FunctionsPostgreSQL Join Type TheoryA Guide to PostgreSQL ViewsData Partitioning: What It Is and Why It MattersUnderstanding PostgreSQL Array FunctionsUnderstanding PostgreSQL's COALESCE FunctionUnderstanding the rank() and dense_rank() Functions in PostgreSQLWhat Is a PostgreSQL Left Join? And a Right Join?Strategies for Improving Postgres JOIN PerformanceUnderstanding Foreign Keys in PostgreSQLUnderstanding PostgreSQL User-Defined FunctionsUnderstanding SQL Aggregate FunctionsUsing PostgreSQL UPDATE With JOINHow to Install PostgreSQL on LinuxUnderstanding HAVING in PostgreSQL (With Examples)How to Fix No Partition of Relation Found for Row in Postgres DatabasesHow to Fix Transaction ID Wraparound ExhaustionUnderstanding WHERE in PostgreSQL (With Examples)Understanding OFFSET in PostgreSQL (With Examples)What Is a PostgreSQL Inner Join?Understanding PostgreSQL SELECTWhat Is Data Compression and How Does It Work?What Is Data Transformation, and Why Is It Important?What Characters Are Allowed in PostgreSQL Strings?Understanding the Postgres string_agg FunctionWhat Is a PostgreSQL Full Outer Join?Self-Hosted or Cloud Database? A Countryside Reflection on Infrastructure ChoicesUnderstanding the Postgres extract() Function
AWS Timestream for InfluxDB Alternative: When You Need to Look FurtherHow to Migrate from AWS Timestream to PostgreSQL: A Technical GuideHow to Choose a Database: A Decision Framework for Modern ApplicationsPostgreSQL Performance Tuning: Key ParametersA Guide to Scaling PostgreSQLHandling Large Objects in PostgresGuide to PostgreSQL PerformanceDetermining the Optimal Postgres Partition SizeNavigating Growing PostgreSQL Tables With Partitioning (and More)SQL/JSON Data Model and JSON in SQL: A PostgreSQL PerspectiveHow to Use PostgreSQL for Data TransformationPostgreSQL Performance Tuning: Designing and Implementing Your Database SchemaPostgreSQL Performance Tuning: Optimizing Database IndexesWhen to Consider Postgres PartitioningDesigning Your Database Schema: Wide vs. Narrow Postgres TablesBest Practices for Time-Series Data Modeling: Single or Multiple Partitioned Table(s) a.k.a. Hypertables What Is a PostgreSQL Temporary View?PostgreSQL Performance Tuning: How to Size Your DatabaseHow to Compute Standard Deviation With PostgreSQLRecursive Query in SQL: What It Is, and How to Write OneHow to Query JSON Metadata in PostgreSQLHow to Query JSONB in PostgreSQLHow to Reduce Bloat in Large PostgreSQL TablesBest Practices for (Time-)Series Metadata Tables A Guide to Data Analysis on PostgreSQLGuide to PostgreSQL SecurityOptimizing Array Queries With GIN Indexes in PostgreSQLPg_partman vs. Hypertables for Postgres PartitioningTop PostgreSQL Drivers for PythonAn Intro to Data Modeling on PostgreSQLGuide to PostgreSQL Database OperationsUnderstanding PostgreSQL TablespacesWhat Is Audit Logging and How to Enable It in PostgreSQLGuide to Postgres Data ManagementHow to Index JSONB Columns in PostgreSQLHow to Monitor and Optimize PostgreSQL Index PerformanceA Guide to pg_restore (and pg_restore Example)Explaining PostgreSQL EXPLAINA PostgreSQL Database Replication GuideHow PostgreSQL Data Aggregation WorksHow to Use Psycopg2: The PostgreSQL Adapter for PythonBuilding a Scalable DatabaseGuide to PostgreSQL Database Design
PostgreSQL Compression: Every Option, When To Use Each, and What To ExpectBest Practices for Postgres Data ManagementHow to Store Video in PostgreSQL Using BYTEABest Practices for Postgres PerformanceHow to Design Your PostgreSQL Database: Two Schema ExamplesBest Practices for Scaling PostgreSQLHow to Handle High-Cardinality Data in PostgreSQLBest Practices for PostgreSQL AggregationBest Practices for Postgres Database ReplicationHow to Use a Common Table Expression (CTE) in SQLBest Practices for Postgres SecurityBest Practices for PostgreSQL Database OperationsBest Practices for PostgreSQL Data AnalysisTesting Postgres Ingest: INSERT vs. Batch INSERT vs. COPYHow to Manage Your Data With Data Retention PoliciesHow to Use PostgreSQL for Data Normalization
PostgreSQL Extensions: amcheckPostgreSQL Extensions: Turning PostgreSQL Into a Vector Database With pgvectorPostgreSQL Extensions: Unlocking Multidimensional Points With Cube PostgreSQL Extensions: hstorePostgreSQL Extensions: ltreePostgreSQL Extensions: Secure Your Time-Series Data With pgcryptoPostgreSQL Extensions: pg_prewarmPostgreSQL Extensions: pgRoutingPostgreSQL Extensions: pg_stat_statementsPostgreSQL Extensions: Database Testing With pgTAPPostgreSQL Extensions: Install pg_trgm for Data MatchingPostgreSQL Extensions: PL/pgSQLPostgreSQL Extensions: Using PostGIS and Timescale for Advanced Geospatial InsightsPostgreSQL Extensions: Intro to uuid-ossp
What Is ClickHouse and How Does It Compare to PostgreSQL and TimescaleDB for Time Series?Timescale vs. Amazon RDS PostgreSQL: Up to 350x Faster Queries, 44 % Faster Ingest, 95 % Storage Savings for Time-Series DataWhat We Learned From Benchmarking Amazon Aurora PostgreSQL ServerlessTimescaleDB vs. Amazon Timestream: 6,000x Higher Inserts, 5-175x Faster Queries, 150-220x CheaperHow to Store Time-Series Data in MongoDB and Why That’s a Bad IdeaPostgreSQL + TimescaleDB: 1,000x Faster Queries, 90 % Data Compression, and Much MoreEye or the Tiger: Benchmarking Cassandra vs. TimescaleDB for Time-Series Data
Manufacturing Analytics Database: Architecture for Real-Time Production DataRobot Fleet Telemetry: Database Architecture for AMR, Industrial Robot, and Service Robot DataData Center Monitoring: What Database Stores Your Telemetry?Fleet Telemetry Database: How to Store and Query Vehicle Sensor Data at ScaleEV Charging Management System: Architecture, OCPP Data, and the Right DatabaseIIoT Database Requirements: Six Things Your Database Must DoWater Utilities Database: How to Store and Query SCADA, AMI, and Quality Data at ScaleWhat Is an Edge Database? On-Device Storage, Sync Patterns, and Choosing the Right StackA Beginner’s Guide to IIoT and Industry 4.0Data Historian vs. Time-Series Database: How to Choose and When to SwitchWhat Is a Data Historian?The Best Databases for IoT in 2026: A Practical ComparisonHow Hopthru Powers Real-Time Transit Analytics From a 1 TB TableUnderstanding IoT (Internet of Things)Storing IoT Data: 8 Reasons Why You Should Use PostgreSQLHow to Simulate a Basic IoT Sensor Dataset on PostgreSQLFrom Ingest to Insights in Milliseconds: Everactive's Tech Transformation With TimescaleHow Ndustrial Is Providing Fast Real-Time Queries and Safely Storing Client Data With 97 % CompressionWhy You Should Use PostgreSQL for Industrial IoT Data Migrating a Low-Code IoT Platform Storing 20M Records/DayHow United Manufacturing Hub Is Introducing Open Source to ManufacturingBuilding IoT Pipelines for Faster Analytics With IoT CoreVisualizing IoT Data at Scale With Hopara and TimescaleDB
A Brief History of AI: How Did We Get Here, and What's Next?A Beginner’s Guide to Vector EmbeddingsPostgreSQL as a Vector Database: A Pgvector TutorialUsing Pgvector With PythonHow to Choose a Vector DatabaseVector Databases Are the Wrong AbstractionUnderstanding DiskANNA Guide to Cosine SimilarityStreaming DiskANN: How We Made PostgreSQL as Fast as Pinecone for Vector DataImplementing Cosine Similarity in PythonVector Database Basics: HNSWVector Database Options for AWSVector Store vs. Vector Database: Understanding the ConnectionPgvector vs. Pinecone: Vector Database Performance and Cost ComparisonHow to Build LLM Applications With Pgvector Vector Store in LangChainHow to Implement RAG With Amazon Bedrock and LangChainRAG Is More Than Just Vector SearchRefining Vector Search Queries With Time Filters in Pgvector: A TutorialUnderstanding Semantic SearchVector Search vs Semantic SearchHNSW vs. DiskANNWhen Should You Use Full-Text Search vs. Vector Search?Building AI Agents with Persistent Memory: A Unified Database ApproachWhat Is Vector Search? Text-to-SQL: A Developer’s Zero-to-Hero GuideNearest Neighbor Indexes: What Are IVFFlat Indexes in Pgvector and How Do They WorkPostgreSQL Hybrid Search Using Pgvector and CohereBuilding an AI Image Gallery With OpenAI CLIP, Claude Sonnet 3.5, and Pgvector
Understanding OLTPUnderstanding OLAP: What It Is, How It Differs From OLTP, and Running It on PostgreSQLColumnar Databases vs. Row-Oriented Databases: Which to Choose?How to Choose an OLAP DatabaseHow to Choose a Real-Time Analytics DatabaseData Analytics vs. Real-Time Analytics: How to Pick Your Database (and Why It Should Be PostgreSQL)PostgreSQL as a Real-Time Analytics DatabaseWhat Is the Best Database for Real-Time AnalyticsHow to Build an IoT Pipeline for Real-Time Analytics in PostgreSQL
Alternatives to RDSWhy Is RDS so Expensive? Understanding RDS Pricing and CostsEstimating RDS CostsHow to Migrate From AWS RDS for PostgreSQL to TimescaleAmazon Aurora vs. RDS: Understanding the Difference
5 InfluxDB Alternatives for Your Time-Series Data8 Reasons to Choose Timescale as Your InfluxDB Alternative InfluxQL, Flux, and SQL: Which Query Language Is Best? (With Cheatsheet)What InfluxDB Got WrongTimescaleDB vs. InfluxDB: Purpose Built Differently for Time-Series Data
Time-Series Downsampling: The Complete Guide to Tiered Data Resolution in SQLContinuous Aggregates: Incremental Materialized Views for Time-Series DataHow to Migrate Your Data to Timescale (3 Ways)Is Postgres Partitioning Really That Hard? An Introduction To HypertablesComplete Guide: Migrating from MongoDB to Tiger Data (Step-by-Step)Postgres TOAST vs. Timescale CompressionBuilding Python Apps With PostgreSQL: A Developer's GuideMore Time-Series Data Analysis, Fewer Lines of Code: Meet HyperfunctionsPostgreSQL Materialized Views and Where to Find Them5 Ways to Monitor Your PostgreSQL DatabaseTimescale Tips: Testing Your Chunk SizeData Visualization in PostgreSQL With Apache Superset
Postgres cheat sheet
HomeData Center & Infrastructure TelemetryTime series basicsPostgres basicsPostgres guidesPostgres best practicesPostgres extensions
Home
What Is DCIM Software, and What Database Does It Use?Data Center Power Monitoring: The Database Layer Behind PUE, PDU, and Sustainability MetricsPrometheus Long-Term Storage: Thanos, Mimir, VictoriaMetrics, and PostgreSQL Compared
Time Series Forecasting with PostgreSQL: Methods, SQL Examples, and When to Use PythonThe Best Time-Series Databases Compared (2026)Time Series Anomaly Detection: Methods, SQL, and Real-Time ImplementationAWS Timestream Alternatives: Your Migration Options After LiveAnalyticsWhat Is Temporal Data?Time-Series Database: What It Is, How It Works, and When You Need OneIs Your Data Time Series? Data Types Supported by PostgreSQL and TimescaleUnderstanding Database Workloads: Variable, Bursty, and Uniform PatternsTime-Series Analysis and Forecasting With Python What Are Open-Source Time-Series Databases—Understanding Your OptionsStationary Time-Series AnalysisAlternatives to TimescaleWhy Consider Using PostgreSQL for Time-Series Data?Time-Series Analysis in RWhat Is a Time Series and How Is It Used?How to Work With Time Series in Python?Tools for Working With Time-Series Analysis in PythonGuide to Time-Series Analysis in PythonUnderstanding Autoregressive Time-Series ModelingCreating a Fast Time-Series Graph With Postgres Materialized Views
PostgreSQL vs. Cassandra: The Decision Framework for Time-Series and Write-Heavy WorkloadsUnderstanding PostgreSQLOptimizing Your Database: A Deep Dive into PostgreSQL Data TypesUnderstanding FROM in PostgreSQL (With Examples)How to Address ‘Error: Could Not Resize Shared Memory Segment’ Understanding FILTER in PostgreSQL (With Examples)How to Install PostgreSQL on MacOSUnderstanding GROUP BY in PostgreSQL (With Examples)Understanding LIMIT in PostgreSQL (With Examples)Understanding PostgreSQL FunctionsUnderstanding ORDER BY in PostgreSQL (With Examples)PostgreSQL Mathematical Functions: Enhancing Coding EfficiencyUnderstanding PostgreSQL WITHIN GROUPUnderstanding WINDOW in PostgreSQL (With Examples)Using PostgreSQL String Functions for Improved Data AnalysisUnderstanding DISTINCT in PostgreSQL (With Examples)PostgreSQL Joins : A SummaryUnderstanding PostgreSQL Date and Time FunctionsWhat Is a PostgreSQL Cross Join?Understanding ACID Compliance Understanding PostgreSQL Conditional FunctionsStructured vs. Semi-Structured vs. Unstructured Data in PostgreSQLUnderstanding percentile_cont() and percentile_disc() in PostgreSQL5 Common Connection Errors in PostgreSQL and How to Solve ThemData Processing With PostgreSQL Window FunctionsPostgreSQL Join Type TheoryA Guide to PostgreSQL ViewsData Partitioning: What It Is and Why It MattersUnderstanding PostgreSQL Array FunctionsUnderstanding PostgreSQL's COALESCE FunctionUnderstanding the rank() and dense_rank() Functions in PostgreSQLWhat Is a PostgreSQL Left Join? And a Right Join?Strategies for Improving Postgres JOIN PerformanceUnderstanding Foreign Keys in PostgreSQLUnderstanding PostgreSQL User-Defined FunctionsUnderstanding SQL Aggregate FunctionsUsing PostgreSQL UPDATE With JOINHow to Install PostgreSQL on LinuxUnderstanding HAVING in PostgreSQL (With Examples)How to Fix No Partition of Relation Found for Row in Postgres DatabasesHow to Fix Transaction ID Wraparound ExhaustionUnderstanding WHERE in PostgreSQL (With Examples)Understanding OFFSET in PostgreSQL (With Examples)What Is a PostgreSQL Inner Join?Understanding PostgreSQL SELECTWhat Is Data Compression and How Does It Work?What Is Data Transformation, and Why Is It Important?What Characters Are Allowed in PostgreSQL Strings?Understanding the Postgres string_agg FunctionWhat Is a PostgreSQL Full Outer Join?Self-Hosted or Cloud Database? A Countryside Reflection on Infrastructure ChoicesUnderstanding the Postgres extract() Function
AWS Timestream for InfluxDB Alternative: When You Need to Look FurtherHow to Migrate from AWS Timestream to PostgreSQL: A Technical GuideHow to Choose a Database: A Decision Framework for Modern ApplicationsPostgreSQL Performance Tuning: Key ParametersA Guide to Scaling PostgreSQLHandling Large Objects in PostgresGuide to PostgreSQL PerformanceDetermining the Optimal Postgres Partition SizeNavigating Growing PostgreSQL Tables With Partitioning (and More)SQL/JSON Data Model and JSON in SQL: A PostgreSQL PerspectiveHow to Use PostgreSQL for Data TransformationPostgreSQL Performance Tuning: Designing and Implementing Your Database SchemaPostgreSQL Performance Tuning: Optimizing Database IndexesWhen to Consider Postgres PartitioningDesigning Your Database Schema: Wide vs. Narrow Postgres TablesBest Practices for Time-Series Data Modeling: Single or Multiple Partitioned Table(s) a.k.a. Hypertables What Is a PostgreSQL Temporary View?PostgreSQL Performance Tuning: How to Size Your DatabaseHow to Compute Standard Deviation With PostgreSQLRecursive Query in SQL: What It Is, and How to Write OneHow to Query JSON Metadata in PostgreSQLHow to Query JSONB in PostgreSQLHow to Reduce Bloat in Large PostgreSQL TablesBest Practices for (Time-)Series Metadata Tables A Guide to Data Analysis on PostgreSQLGuide to PostgreSQL SecurityOptimizing Array Queries With GIN Indexes in PostgreSQLPg_partman vs. Hypertables for Postgres PartitioningTop PostgreSQL Drivers for PythonAn Intro to Data Modeling on PostgreSQLGuide to PostgreSQL Database OperationsUnderstanding PostgreSQL TablespacesWhat Is Audit Logging and How to Enable It in PostgreSQLGuide to Postgres Data ManagementHow to Index JSONB Columns in PostgreSQLHow to Monitor and Optimize PostgreSQL Index PerformanceA Guide to pg_restore (and pg_restore Example)Explaining PostgreSQL EXPLAINA PostgreSQL Database Replication GuideHow PostgreSQL Data Aggregation WorksHow to Use Psycopg2: The PostgreSQL Adapter for PythonBuilding a Scalable DatabaseGuide to PostgreSQL Database Design
PostgreSQL Compression: Every Option, When To Use Each, and What To ExpectBest Practices for Postgres Data ManagementHow to Store Video in PostgreSQL Using BYTEABest Practices for Postgres PerformanceHow to Design Your PostgreSQL Database: Two Schema ExamplesBest Practices for Scaling PostgreSQLHow to Handle High-Cardinality Data in PostgreSQLBest Practices for PostgreSQL AggregationBest Practices for Postgres Database ReplicationHow to Use a Common Table Expression (CTE) in SQLBest Practices for Postgres SecurityBest Practices for PostgreSQL Database OperationsBest Practices for PostgreSQL Data AnalysisTesting Postgres Ingest: INSERT vs. Batch INSERT vs. COPYHow to Manage Your Data With Data Retention PoliciesHow to Use PostgreSQL for Data Normalization
PostgreSQL Extensions: amcheckPostgreSQL Extensions: Turning PostgreSQL Into a Vector Database With pgvectorPostgreSQL Extensions: Unlocking Multidimensional Points With Cube PostgreSQL Extensions: hstorePostgreSQL Extensions: ltreePostgreSQL Extensions: Secure Your Time-Series Data With pgcryptoPostgreSQL Extensions: pg_prewarmPostgreSQL Extensions: pgRoutingPostgreSQL Extensions: pg_stat_statementsPostgreSQL Extensions: Database Testing With pgTAPPostgreSQL Extensions: Install pg_trgm for Data MatchingPostgreSQL Extensions: PL/pgSQLPostgreSQL Extensions: Using PostGIS and Timescale for Advanced Geospatial InsightsPostgreSQL Extensions: Intro to uuid-ossp
What Is ClickHouse and How Does It Compare to PostgreSQL and TimescaleDB for Time Series?Timescale vs. Amazon RDS PostgreSQL: Up to 350x Faster Queries, 44 % Faster Ingest, 95 % Storage Savings for Time-Series DataWhat We Learned From Benchmarking Amazon Aurora PostgreSQL ServerlessTimescaleDB vs. Amazon Timestream: 6,000x Higher Inserts, 5-175x Faster Queries, 150-220x CheaperHow to Store Time-Series Data in MongoDB and Why That’s a Bad IdeaPostgreSQL + TimescaleDB: 1,000x Faster Queries, 90 % Data Compression, and Much MoreEye or the Tiger: Benchmarking Cassandra vs. TimescaleDB for Time-Series Data
Manufacturing Analytics Database: Architecture for Real-Time Production DataRobot Fleet Telemetry: Database Architecture for AMR, Industrial Robot, and Service Robot DataData Center Monitoring: What Database Stores Your Telemetry?Fleet Telemetry Database: How to Store and Query Vehicle Sensor Data at ScaleEV Charging Management System: Architecture, OCPP Data, and the Right DatabaseIIoT Database Requirements: Six Things Your Database Must DoWater Utilities Database: How to Store and Query SCADA, AMI, and Quality Data at ScaleWhat Is an Edge Database? On-Device Storage, Sync Patterns, and Choosing the Right StackA Beginner’s Guide to IIoT and Industry 4.0Data Historian vs. Time-Series Database: How to Choose and When to SwitchWhat Is a Data Historian?The Best Databases for IoT in 2026: A Practical ComparisonHow Hopthru Powers Real-Time Transit Analytics From a 1 TB TableUnderstanding IoT (Internet of Things)Storing IoT Data: 8 Reasons Why You Should Use PostgreSQLHow to Simulate a Basic IoT Sensor Dataset on PostgreSQLFrom Ingest to Insights in Milliseconds: Everactive's Tech Transformation With TimescaleHow Ndustrial Is Providing Fast Real-Time Queries and Safely Storing Client Data With 97 % CompressionWhy You Should Use PostgreSQL for Industrial IoT Data Migrating a Low-Code IoT Platform Storing 20M Records/DayHow United Manufacturing Hub Is Introducing Open Source to ManufacturingBuilding IoT Pipelines for Faster Analytics With IoT CoreVisualizing IoT Data at Scale With Hopara and TimescaleDB
A Brief History of AI: How Did We Get Here, and What's Next?A Beginner’s Guide to Vector EmbeddingsPostgreSQL as a Vector Database: A Pgvector TutorialUsing Pgvector With PythonHow to Choose a Vector DatabaseVector Databases Are the Wrong AbstractionUnderstanding DiskANNA Guide to Cosine SimilarityStreaming DiskANN: How We Made PostgreSQL as Fast as Pinecone for Vector DataImplementing Cosine Similarity in PythonVector Database Basics: HNSWVector Database Options for AWSVector Store vs. Vector Database: Understanding the ConnectionPgvector vs. Pinecone: Vector Database Performance and Cost ComparisonHow to Build LLM Applications With Pgvector Vector Store in LangChainHow to Implement RAG With Amazon Bedrock and LangChainRAG Is More Than Just Vector SearchRefining Vector Search Queries With Time Filters in Pgvector: A TutorialUnderstanding Semantic SearchVector Search vs Semantic SearchHNSW vs. DiskANNWhen Should You Use Full-Text Search vs. Vector Search?Building AI Agents with Persistent Memory: A Unified Database ApproachWhat Is Vector Search? Text-to-SQL: A Developer’s Zero-to-Hero GuideNearest Neighbor Indexes: What Are IVFFlat Indexes in Pgvector and How Do They WorkPostgreSQL Hybrid Search Using Pgvector and CohereBuilding an AI Image Gallery With OpenAI CLIP, Claude Sonnet 3.5, and Pgvector
Understanding OLTPUnderstanding OLAP: What It Is, How It Differs From OLTP, and Running It on PostgreSQLColumnar Databases vs. Row-Oriented Databases: Which to Choose?How to Choose an OLAP DatabaseHow to Choose a Real-Time Analytics DatabaseData Analytics vs. Real-Time Analytics: How to Pick Your Database (and Why It Should Be PostgreSQL)PostgreSQL as a Real-Time Analytics DatabaseWhat Is the Best Database for Real-Time AnalyticsHow to Build an IoT Pipeline for Real-Time Analytics in PostgreSQL
Alternatives to RDSWhy Is RDS so Expensive? Understanding RDS Pricing and CostsEstimating RDS CostsHow to Migrate From AWS RDS for PostgreSQL to TimescaleAmazon Aurora vs. RDS: Understanding the Difference
5 InfluxDB Alternatives for Your Time-Series Data8 Reasons to Choose Timescale as Your InfluxDB Alternative InfluxQL, Flux, and SQL: Which Query Language Is Best? (With Cheatsheet)What InfluxDB Got WrongTimescaleDB vs. InfluxDB: Purpose Built Differently for Time-Series Data
Time-Series Downsampling: The Complete Guide to Tiered Data Resolution in SQLContinuous Aggregates: Incremental Materialized Views for Time-Series DataHow to Migrate Your Data to Timescale (3 Ways)Is Postgres Partitioning Really That Hard? An Introduction To HypertablesComplete Guide: Migrating from MongoDB to Tiger Data (Step-by-Step)Postgres TOAST vs. Timescale CompressionBuilding Python Apps With PostgreSQL: A Developer's GuideMore Time-Series Data Analysis, Fewer Lines of Code: Meet HyperfunctionsPostgreSQL Materialized Views and Where to Find Them5 Ways to Monitor Your PostgreSQL DatabaseTimescale Tips: Testing Your Chunk SizeData Visualization in PostgreSQL With Apache Superset
Postgres cheat sheet
Tiger Data

Products

  • TimescaleDB
  • Tiger Cloud
  • TimescaleDB Enterprise
  • Postgres Search Stack

Industry

  • Data Centers
  • Energy & Utilities
  • Oil & Gas Operations
  • Smart Manufacturing
  • Crypto

Support

  • Cloud Status
  • Support
  • Security
  • Terms of Service
  • Code Of Conduct

Learn

  • Documentation
  • Blog
  • Tutorials
  • Changelog
  • Success Stories

Company

  • About
  • Contact Us
  • Careers
  • Newsroom
  • Brand
  • Events

Products

  • TimescaleDB
  • Tiger Cloud
  • TimescaleDB Enterprise
  • Postgres Search Stack

Industry

  • Data Centers
  • Energy & Utilities
  • Oil & Gas Operations
  • Smart Manufacturing
  • Crypto

Support

  • Cloud Status
  • Support
  • Security
  • Terms of Service
  • Code Of Conduct

Learn

  • Documentation
  • Blog
  • Tutorials
  • Changelog
  • Success Stories

Company

  • About
  • Contact Us
  • Careers
  • Newsroom
  • Brand
  • Events
Privacy preferencesLegalPrivacySitemap

Subscribe to the Tiger Data newsletter

Gold Partner with Inductive Automation — Ignition

2026 (c) Timescale, Inc., d/b/a Tiger Data.
All rights reserved.

Tiger Data
GOLD PARTNER WITHINDUCTIVE AUTOMATION

2026 (c) Timescale, Inc., d/b/a Tiger Data.
All rights reserved.

Privacy preferencesLegalPrivacySitemap

By Tiger Data Team

Updated at Jul 9, 2026

Table of contents

    Prometheus Long-Term Storage: Thanos, Mimir, VictoriaMetrics, and PostgreSQL Compared

    Prometheus Long-Term Storage: Thanos, Mimir, VictoriaMetrics, and PostgreSQL Compared

    By Tiger Data Team

    Updated at Jul 9, 2026

    You're scraping 500 targets every 15 seconds. After two weeks, Prometheus's local TSDB hits its default retention window and starts dropping data. The on-call engineer needs three months of metrics to complete the post-mortem. The capacity planning team needs six months to model seasonal load. Compliance wants a year.

    The answer isn't to keep stretching --storage.tsdb.retention.time and hoping the disks hold. Prometheus's local storage is designed for recent data at single-node scale. Long-term retention is a different problem, and the remote_write API is how Prometheus hands it off.

    But remote_write opens a backend decision that the official Prometheus docs don't make for you. This guide evaluates the four main approaches to prometheus remote storage: Thanos, Grafana Mimir, VictoriaMetrics, and PostgreSQL with TimescaleDB. For each, we cover architecture, trade-offs, and the conditions under which it is genuinely the right choice.

    One transparency note upfront: Tiger Data builds a PostgreSQL-native time-series database. The TimescaleDB section reflects our perspective, but this guide includes honest assessments of all four options, including cases where TimescaleDB is not the right fit.

    Why Prometheus local storage isn't designed for long-term retention

    Prometheus TSDB writes incoming samples to a write-ahead log, compacts them into 2-hour blocks, and progressively merges blocks into larger chunks covering up to 31 days. That design is optimized for fast recent writes and bounded range queries on a single node. It was never intended to be a durable long-term store.

    There are two local retention levers:

    • --storage.tsdb.retention.time (default: 15 days) controls how long Prometheus keeps data before dropping chunks. You can raise this to 30 or 90 days on local disk, and for small deployments that is sometimes sufficient.

    • --storage.tsdb.retention.size caps total disk usage. Set both flags simultaneously and Prometheus enforces whichever limit is reached first.

    But local-only retention has three structural limits that matter at scale. First, there is no high availability: one Prometheus node is one single point of failure. If it goes down during a retention window, that data is gone. Second, there is no horizontal query scaling: a single Prometheus instance handles all queries against its local TSDB, and query latency grows as retention windows extend and cardinality increases. Third, disk cost grows linearly with cardinality multiplied by retention window. Extending local retention to a year on a high-cardinality fleet is a significant infrastructure commitment with no redundancy.

    This is the architectural gap remote_write fills. Prometheus can stream samples to an external endpoint in parallel with writing to local TSDB. Once a remote backend is in place, you reduce the local buffer to a short window (2-7 days) and let the remote backend own durable long-term storage.

    For a deeper look at how Prometheus stores and indexes data internally, including block structure, WAL mechanics, and chunk compaction, that blog post covers the internals in detail.

    How Prometheus remote_write works

    remote_write is straightforward in concept: Prometheus serializes metric samples as protocol buffer batches and POSTs them to one or more configured endpoints. The receiving system is responsible for durable storage and query serving. Prometheus continues writing to local TSDB simultaneously, so a transient remote backend failure doesn't cause data loss during the WAL retention window.

    remote_read is the companion feature. It allows Prometheus's own query engine to pull historical data from a remote backend when answering PromQL queries. In practice, most teams skip it. The more common pattern is configuring the remote backend as a Grafana datasource directly, which avoids double-proxying and keeps query latency lower.

    Three remote_write queue parameters matter for high-cardinality environments:

    • queue_config.capacity sets the number of samples the queue holds before blocking. On high-cardinality scrapers, undersizing this causes WAL growth and backpressure.

    • max_samples_per_send controls batch size per request to the remote endpoint. Tune this against the backend's ingestion throughput.

    • batch_send_deadline sets the maximum time to wait before sending a partial batch. Lower values reduce latency at the cost of smaller, less efficient batches.

    This section is context for the backend comparison below, not a full configuration tutorial. Each backend has its own tuning recommendations.

    The four primary backends for Prometheus long-term storage

    Each backend covered here accepts Prometheus remote_write but differs in storage architecture, operational footprint, query language support, and cost model. The right choice depends on your scale, team size, and what you need to do with the metrics once they are stored.

    Thanos

    Thanos is a set of open-source components that add long-term storage, a global query view, and downsampling on top of existing Prometheus installations. It is a CNCF project with wide adoption in large Kubernetes environments.

    The core of the Thanos architecture is the Sidecar, a process that runs alongside each Prometheus instance and uploads completed TSDB blocks to object storage (S3, GCS, or Azure Blob) as Prometheus finishes writing them. There is no separate write path: Prometheus keeps writing locally, and Thanos reads from object storage for any historical data beyond the local retention window. The Store Gateway serves queries from object storage, the Querier fans out queries across Store Gateways, and the Compactor handles downsampling and block deduplication.

    The key strength of Thanos is that it requires minimal changes to how Prometheus operates. You add the Sidecar and point it at an S3 bucket. Existing scrape configurations stay the same. Native downsampling support (5-minute and 1-hour rollups over object storage data) reduces query costs on long time ranges. Multi-cloud object storage support is strong.

    The limitations are operational. Querier, Store Gateway, Sidecar, and Compactor are separate processes to deploy, configure, and monitor. Query fanout latency increases with data volume, because historical queries have to scan across multiple Store Gateway instances. Object storage costs scale with both retention length and query frequency (GET request charges add up on large data sets).

    Query language support is PromQL only. Multi-tenancy is supported but requires explicit configuration through Thanos Querier tenant labels.

    Thanos fits teams that have existing Prometheus fleets, already use S3-compatible object storage, and want to add long-term storage without changing their scrape configuration or Prometheus write path.

    Grafana Mimir

    Grafana Mimir is a horizontally scalable, multi-tenant Prometheus-compatible backend. It is the successor to Cortex. Cortex’s latest stable release is 1.20.1 (December 2025), with 1.21.0 still in release-candidate stage as of mid-2026. But active development is minimal - the Cortex maintainers themselves have migrated to Mimir. Teams currently on Cortex are generally advised to evaluate a Mimir migration.

    Mimir's architecture separates every function into its own component: Distributor, Ingester, Store Gateway, Compactor, Querier, and Query Frontend. In Mimir 3.0, the write path uses Kafka-based ingestion, which enables ingester replay on failure and significantly improves write durability at scale. Object storage (S3 or GCS) is the storage backend for all persistent data.

    Mimir's strengths are scale and multi-tenancy. It is designed to run Prometheus-compatible metrics for large organizations with multiple teams or tenants, and native multi-tenancy is first-class rather than bolted on. Grafana Cloud uses Mimir as its backend, so teams already on Grafana Cloud get Mimir without operating it themselves.

    The operational complexity is very high. Running Mimir self-hosted is appropriate for platform engineering teams with dedicated capacity to manage a distributed system. Adding the Kafka dependency in Mimir 3.0 extends that operational surface further. For a single team or a mid-sized Prometheus deployment, Mimir is substantial overhead.

    Query language support is PromQL only. Multi-tenancy is native and first-class.

    Mimir fits large organizations running Prometheus at scale across multiple teams or tenants, or teams already on Grafana Cloud where Mimir is managed for them.

    VictoriaMetrics

    VictoriaMetrics is a ground-up TSDB written in Go. It does not use Prometheus's storage engine: it has its own proprietary columnar storage format engineered for time-series workloads. It accepts Prometheus remote_write natively and exposes MetricsQL, a PromQL-compatible superset that extends PromQL with additional functions.

    The single-node VictoriaMetrics binary is notable for operational simplicity. There are no external dependencies, no separate components, no object storage requirement. You run one binary. VictoriaMetrics's own benchmarks report up to 7x better storage efficiency than Prometheus TSDB, with actual ratios varying by data characteristics. VictoriaMetrics Cluster is the horizontally scalable variant, which reintroduces component separation (vminsert, vmstorage, vmselect) and corresponding operational complexity.

    The limitations worth noting: MetricsQL is a superset of PromQL, not pure PromQL. Most queries work identically, but edge-case query behavior differs, and tooling that depends on strict PromQL compatibility can behave unexpectedly. Single-node VictoriaMetrics has horizontal scaling limits. Cluster mode solves this but reduces the simplicity advantage. There is no native SQL support.

    Multi-tenancy is supported in cluster mode only. VictoriaMetrics, Inc. provides commercial LTS releases and support.

    VictoriaMetrics fits cost-conscious teams or teams that want the simplest possible standalone metrics store. If SQL queryability is not a requirement and pure PromQL (or MetricsQL compatibility) is sufficient, single-node VictoriaMetrics offers a strong combination of storage efficiency and low operational overhead.

    PostgreSQL with TimescaleDB

    TimescaleDB is an open-source PostgreSQL extension for time-series workloads. It can function as a Prometheus remote_write target via a remote-storage adapter, storing metrics in hypertables with full SQL queryability. Note that PromQL access depends on an adapter layer rather than a native PromQL engine — see the history note below. 

    A transparency note on history: Tiger Data (formerly Timescale) operated Promscale, a unified backend for Prometheus and OpenTelemetry metrics built on TimescaleDB. Promscale was deprecated in April 2023 and is not a current option. Legacy repos like prometheus-postgresql-adapter and pg_prometheus are also deprecated. 

    With Promscale deprecated, Tiger Data no longer ships a first-party Prometheus remote_write adapter. The underlying capability — TimescaleDB functioning as a durable Prometheus metrics store via hypertables — remains technically valid, but it now depends on a community or custom remote-storage adapter rather than a maintained, vendor-supported one. Teams whose primary requirement is native PromQL should weigh this gap, since Promscale was what previously provided that layer. 

    In this architecture, Prometheus remote_write sends samples to an adapter that writes to a TimescaleDB hypertable (a time-partitioned PostgreSQL table). TimescaleDB's Hypercore hybrid row-columnar storage engine automatically compresses older chunks, typically achieving 90-98% storage reduction for time-series workloads. Automated data retention policies via add_retention_policy drop old raw data on a defined schedule without manual intervention. Continuous aggregates for automated downsampling precompute rollups (hourly, daily) incrementally, so long-range queries stay fast without external tooling.

    The query advantage over the other three options: full SQL on metrics data. You can write window functions over ingestion rate trends, join metrics with deployment event tables, correlate CPU saturation with application error rates, or build SLA compliance reports across arbitrary time windows - none of which are expressible in PromQL. This is the capability that makes the PostgreSQL path distinct, not merely competitive on PromQL features.

    The PromQL query layer requires a third-party or custom adapter - this is not a native PromQL engine, and Tiger Data does not currently provide a supported one. Teams that live entirely in Grafana with PromQL datasources will need to build or source that layer themselves. PostgreSQL operational familiarity is required; this is not a good fit for teams with no existing PostgreSQL investment. It is also not the right choice for teams whose primary requirement is high-volume pure-metrics storage with no analytics need.

    Tiger Cloud (Tiger Data's managed PostgreSQL and TimescaleDB service) removes the self-hosted operational burden if you want the SQL analytics capability without running PostgreSQL yourself.

    Multi-tenancy is handled via PostgreSQL schema-level isolation - functional but not native metrics-layer multi-tenancy.

    PostgreSQL with TimescaleDB fits teams that already run PostgreSQL in production and want to extend it to metrics storage, teams that need SQL analytics on metrics data (capacity planning, join queries with application tables, SLA reporting), or teams that want automated downsampling and retention managed by the database rather than external tooling.

    Comparison table: Prometheus long-term storage backends

    Backend

    Storage layer

    Query language

    PromQL compatible

    SQL support

    Multi-tenancy

    Operational complexity

    Managed cloud option

    Best fit

    Thanos

    Object storage (S3/GCS/Azure)

    PromQL

    Yes (native)

    No

    Yes (config required)

    High

    No (self-hosted)

    Existing Prometheus fleets with S3 infrastructure

    Grafana Mimir

    Object storage + Kafka

    PromQL

    Yes (native)

    No

    Yes (native)

    Very high

    Yes (Grafana Cloud)

    Multi-tenant SaaS-scale deployments

    VictoriaMetrics

    Proprietary columnar

    MetricsQL

    Yes (superset)

    No

    Cluster mode only

    Low (single-node) / High (cluster)

    Yes (Managed VictoriaMetrics)

    Cost-conscious teams prioritizing simplicity

    PostgreSQL + TimescaleDB

    PostgreSQL (hypertables)

    SQL + PromQL via adapter

    Yes (via third-party/custom adapter) 

    Yes (full SQL)

    Schema-level isolation

    Medium

    Yes (Tiger Cloud)

    SQL analytics on metrics, PostgreSQL-native teams

    Note: AWS Timestream LiveAnalytics is not included in this comparison. It was closed to new customers in June 2025.

    How to configure Prometheus remote_write

    The generic remote_write configuration in prometheus.yml follows this pattern, regardless of which backend you use:

    remote_write: - url: "https://<your-backend-endpoint>/api/v1/write" queue_config: capacity: 10000 max_samples_per_send: 2000 batch_send_deadline: 5s max_shards: 10

    Replace <your-backend-endpoint> with the receiver endpoint your backend provides. Each backend publishes its own endpoint format and any additional authentication configuration.

    For a PostgreSQL remote storage adapter writing to TimescaleDB, the configuration follows the same pattern but points to the adapter's ingestion endpoint:

    remote_write: - url: "http://<adapter-host>:<port>/write" queue_config: capacity: 10000 max_samples_per_send: 2000 max_shards: 8

    A remote-storage adapter translates Prometheus's protocol buffer format into SQL writes against a TimescaleDB hypertable. Because Tiger Data's first-party adapter (Promscale) is deprecated, this requires a community or self-maintained adapter; refer to that project's documentation for configuration. The TimescaleDB documentation covers hypertable setup, retention, and continuous aggregates on the storage side. The Prometheus community also maintains a list of remote storage integrations on the Prometheus integrations page - a useful reference if you are evaluating adapter options beyond the ones covered here.

    Three practical points for any remote_write deployment:

    First, reduce local retention once remote write is confirmed stable. Set --storage.tsdb.retention.time=7d to keep a short local buffer while the remote backend handles durable history. This significantly reduces local disk pressure.

    Second, tune max_shards proportional to your remote backend's ingestion throughput. Too few shards create a bottleneck; too many can overwhelm the backend with concurrent connections.

    Third, monitor prometheus_remote_storage_failed_samples_total and prometheus_remote_storage_queue_length. Rising queue length signals that the remote backend cannot keep up with ingest rate. Failed samples indicate persistent write failures and potential data loss.

    Decision framework: how to choose

    This is a genuine decision, not a ranking. Each backend is the right choice in specific conditions.

    Choose Thanos if:

    • You have an existing Prometheus fleet and need long-term storage without changing how Prometheus scrapes or writes locally.

    • Your organization already uses S3-compatible object storage and wants to reuse that infrastructure.

    • You need a global query view across multiple Prometheus instances in different regions or clusters.

    Choose Grafana Mimir if:

    • You are running Prometheus at multi-tenant scale: multiple teams, thousands of active series per tenant, SaaS-scale deployments.

    • You are already on Grafana Cloud or heavily invested in the Grafana observability stack.

    • You have a dedicated platform engineering team with capacity to manage a distributed system.

    Choose VictoriaMetrics if:

    • Operational simplicity is the top priority and a single-binary deployment is appealing.

    • You need better storage efficiency than Prometheus TSDB and are not running PostgreSQL in production.

    • PromQL or MetricsQL is sufficient - no SQL requirement on your metrics data.

    Choose PostgreSQL with TimescaleDB if:

    • Your team already runs PostgreSQL in production and wants to extend it to metrics storage without adding a new system.

    • You need SQL analytics on metrics: capacity planning across arbitrary time windows, joins with deployment event tables or application data, SLA compliance reports.

    • You want automated downsampling and data retention managed by the database rather than external tooling.

    • You want a managed cloud edition (Tiger Cloud) that removes the operational burden of self-hosting PostgreSQL for metrics.

    One category to avoid: do not provision AWS Timestream LiveAnalytics. It was closed to new customers in June 2025. Timestream for InfluxDB is the surviving AWS managed metrics product, but it uses the InfluxDB protocol, not Prometheus's remote_write.

    If you are evaluating whether to move away from Prometheus entirely rather than extending it, the Prometheus alternatives guide covers nine options including Grafana Mimir, VictoriaMetrics, Datadog, and others in a full replacement context.

    For teams managing data center infrastructure at scale, the related guide on data center telemetry database covers broader telemetry storage architecture decisions that complement the Prometheus-specific storage question.

    FAQ

    What is Prometheus's default retention period?

    Prometheus defaults to 15 days (--storage.tsdb.retention.time=15d). A secondary limit, --storage.tsdb.retention.size, caps disk usage (default: 0, meaning no size limit). Both flags can be set simultaneously - Prometheus enforces whichever limit is hit first.

    How do I extend Prometheus retention beyond 15 days?

    You have two options. First, raise --storage.tsdb.retention.time - practical up to ~90 days on local disk before disk cost and lack of HA become problems. Second, configure remote_write to ship metrics to a durable backend (Thanos, Mimir, VictoriaMetrics, or PostgreSQL + TimescaleDB) and reduce local retention to a short buffer window (2-7 days).

    What is Prometheus remote_write and how does it work?

    remote_write is a Prometheus feature that ships metric samples, in real time, to an external storage endpoint. Prometheus serializes samples as protocol buffer batches and POSTs them to a configured URL. The receiving system stores the samples durably. Prometheus continues writing to local TSDB in parallel, so remote backend failure does not cause data loss during the WAL retention window.

    What is the difference between Thanos, Mimir, and VictoriaMetrics?

    All three accept Prometheus remote_write or integrate at the storage layer, but differ in architecture. Thanos uses object storage (S3/GCS) and a sidecar pattern with no change to Prometheus's write path. Mimir is a horizontally scalable, multi-tenant system suited to large-scale deployments. VictoriaMetrics is a ground-up TSDB with a single-binary option, proprietary columnar storage, and MetricsQL (a PromQL superset).

    Can PostgreSQL be used as a Prometheus remote storage backend?

    Yes. TimescaleDB (a PostgreSQL extension for time-series data) can function as a Prometheus remote_write backend. Metrics land in hypertables and are queryable via SQL. This requires a remote_write adapter between Prometheus and PostgreSQL. Tiger Data's first-party adapter (Promscale) is deprecated, so this currently relies on a community or custom adapter. The advantage: full SQL on metrics data, native retention policies, and continuous aggregates for automated downsampling.

    What happened to Promscale?

    Promscale was a unified Prometheus and OpenTelemetry backend built by Tiger Data (then Timescale) on top of TimescaleDB. It was deprecated in April 2023 and is no longer maintained. Tiger Data no longer ships a first-party Prometheus backend; using TimescaleDB as a Prometheus store now relies on a community or custom remote-storage adapter writing to hypertables, rather than Promscale.

    What is the best Prometheus long-term storage solution?

    There is no single best option. Thanos is the safest choice for teams with existing Prometheus fleets and S3 infrastructure. Mimir is built for multi-tenant scale. VictoriaMetrics wins on simplicity and storage efficiency. PostgreSQL + TimescaleDB is the right choice when SQL queryability and PostgreSQL-native tooling matter.

    How does Prometheus remote_write affect local storage?

    When remote_write is configured, Prometheus writes samples to both local TSDB and the remote endpoint simultaneously. Once a remote backend is in place, you can reduce --storage.tsdb.retention.time to 2–7 days. The local TSDB functions as a short buffer and recent-data cache; historical queries go to the remote backend directly.

    What is the difference between remote_write and remote_read?

    remote_write pushes new samples from Prometheus to a remote endpoint in real time. remote_read allows Prometheus's query engine to pull historical data from a remote backend when answering PromQL queries. Most teams query the remote backend directly through Grafana (with it as a datasource) rather than relying on Prometheus remote_read, which avoids double-proxying and reduces query latency.

    Is Cortex still maintained in 2026?

    Cortex is still open-source and functional but has been effectively superseded by Grafana Mimir, which the same community developed as its successor. Cortex's latest stable release is 1.20.1 (December 2025), with 1.21.0 still in release-candidate stage as of mid-2026; new development activity is minimal and the core Cortex maintainers have migrated to Mimir. Teams currently on Cortex are generally advised to evaluate a migration to Mimir.

    How do I configure Prometheus remote_write for TimescaleDB?

    Configure a remote_write endpoint in prometheus.yml pointing to a remote-storage adapter that accepts Prometheus's protocol buffer format and writes to a TimescaleDB hypertable. Since Promscale is deprecated, you'll need a community or custom adapter for this. Reduce local retention to 2–7 days once the remote write is stable. Tune queue_config parameters (max_shards, capacity) to match your scrape volume and remote backend ingestion throughput. Full configuration details are in the TimescaleDB documentation.