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

    Oilfield Services

    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

View on GitHub (opens in a new tab)

Contact usStart a free trial
Home
Tiger MCP vs. a Generic Postgres MCP Server
Time Series Forecasting with PostgreSQL: Methods, SQL Examples, and When to Use PythonTime-Series Analysis and Forecasting With Python Why Consider Using PostgreSQL for Time-Series Data?Time-Series Analysis in RWhat Is Temporal Data?Understanding Autoregressive Time-Series ModelingAlternatives to TimescaleStationary Time-Series AnalysisWhat Are Open-Source Time-Series Databases—Understanding Your OptionsIs Your Data Time Series? Data Types Supported by PostgreSQL and TimescaleUnderstanding Database Workloads: Variable, Bursty, and Uniform PatternsThe Best Time-Series Databases Compared (2026)Time Series Anomaly Detection: Methods, SQL, and Real-Time ImplementationAWS Timestream Alternatives: Your Migration Options After LiveAnalyticsTime-Series Database: What It Is, How It Works, and When You Need OneWhat 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 PythonCreating a Fast Time-Series Graph With Postgres Materialized Views
OpenTelemetry Backend: Choosing Metrics Storage That Doesn't Lock You InGPU Cluster Monitoring: The Database Behind AI Infrastructure TelemetryWhat 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
Understanding PostgreSQLUnderstanding SQL Aggregate FunctionsUnderstanding the rank() and dense_rank() Functions in PostgreSQLUnderstanding percentile_cont() and percentile_disc() in PostgreSQLStructured vs. Semi-Structured vs. Unstructured Data in PostgreSQLOptimizing Your Database: A Deep Dive into PostgreSQL Data TypesPostgres Cheat SheetHow to Address ‘Error: Could Not Resize Shared Memory Segment’ Understanding the Postgres extract() FunctionUnderstanding FROM in PostgreSQL (With Examples)How to Install PostgreSQL on LinuxHow to Install PostgreSQL on MacOSUnderstanding FILTER in PostgreSQL (With Examples)Understanding HAVING in PostgreSQL (With Examples)5 Common Connection Errors in PostgreSQL and How to Solve ThemUnderstanding GROUP BY in PostgreSQL (With Examples)How to Fix No Partition of Relation Found for Row in Postgres DatabasesUnderstanding LIMIT in PostgreSQL (With Examples)How to Fix Transaction ID Wraparound ExhaustionUnderstanding ORDER BY in PostgreSQL (With Examples)Understanding PostgreSQL FunctionsUnderstanding WINDOW in PostgreSQL (With Examples)Understanding PostgreSQL WITHIN GROUPPostgreSQL Mathematical Functions: Enhancing Coding EfficiencyUnderstanding DISTINCT in PostgreSQL (With Examples)Understanding WHERE in PostgreSQL (With Examples)Understanding OFFSET in PostgreSQL (With Examples)Understanding the Postgres string_agg FunctionUnderstanding PostgreSQL SELECTWhat Characters Are Allowed in PostgreSQL Strings?What Is Data Transformation, and Why Is It Important?What Is Data Compression and How Does It Work?Using PostgreSQL UPDATE With JOINUnderstanding PostgreSQL User-Defined FunctionsUnderstanding Foreign Keys in PostgreSQLData Processing With PostgreSQL Window FunctionsUnderstanding PostgreSQL Date and Time FunctionsWhat Is a PostgreSQL Full Outer Join?What Is a PostgreSQL Inner Join?What Is a PostgreSQL Left Join? And a Right Join?PostgreSQL Join Type TheoryA Guide to PostgreSQL ViewsStrategies for Improving Postgres JOIN PerformanceUnderstanding PostgreSQL's COALESCE FunctionUnderstanding PostgreSQL Array FunctionsUnderstanding PostgreSQL Conditional FunctionsUsing PostgreSQL String Functions for Improved Data AnalysisPostgreSQL vs. Cassandra: The Decision Framework for Time-Series and Write-Heavy WorkloadsPostgreSQL Joins : A SummaryWhat Is a PostgreSQL Cross Join?Data Partitioning: What It Is and Why It MattersSelf-Hosted or Cloud Database? A Countryside Reflection on Infrastructure ChoicesUnderstanding ACID Compliance
Connect Your AI Coding Agent to Tiger Cloud: Setup for Cursor, Claude Code, VS Code, and MoreHow to Monitor and Optimize PostgreSQL Index PerformanceGuide to PostgreSQL PerformancePostgreSQL Performance Tuning: Designing and Implementing Your Database SchemaPostgreSQL Performance Tuning: Key ParametersPostgreSQL Performance Tuning: Optimizing Database IndexesDetermining the Optimal Postgres Partition SizeWhen to Consider Postgres PartitioningAn Intro to Data Modeling on PostgreSQLDesigning Your Database Schema: Wide vs. Narrow Postgres TablesGuide to PostgreSQL Database OperationsBest Practices for Time-Series Data Modeling: Single or Multiple Partitioned Table(s) a.k.a. Hypertables Best Practices for (Time-)Series Metadata Tables A PostgreSQL Database Replication GuideA Guide to Data Analysis on PostgreSQLHow to Query JSONB in PostgreSQLHow to Compute Standard Deviation With PostgreSQLPostgreSQL Performance Tuning: How to Size Your DatabaseSQL/JSON Data Model and JSON in SQL: A PostgreSQL PerspectiveUnderstanding PostgreSQL TablespacesTop PostgreSQL Drivers for PythonPg_partman vs. Hypertables for Postgres PartitioningExplaining PostgreSQL EXPLAINGuide to PostgreSQL Database DesignHow PostgreSQL Data Aggregation WorksBuilding a Scalable DatabaseA Guide to pg_restore (and pg_restore Example)How to Index JSONB Columns in PostgreSQLWhat Is Audit Logging and How to Enable It in PostgreSQLOptimizing Array Queries With GIN Indexes in PostgreSQLHow to Reduce Bloat in Large PostgreSQL TablesGuide to PostgreSQL SecurityHow to Query JSON Metadata in PostgreSQLRecursive Query in SQL: What It Is, and How to Write OneNavigating Growing PostgreSQL Tables With Partitioning (and More)What Is a PostgreSQL Temporary View?How to Use PostgreSQL for Data TransformationHandling Large Objects in PostgresHow to Use Psycopg2: The PostgreSQL Adapter for PythonA Guide to Scaling PostgreSQLAWS 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 ApplicationsGuide to Postgres Data Management
Time-Series Database High Availability and Disaster RecoveryBest Practices for Scaling PostgreSQLHow to Store Video in PostgreSQL Using BYTEABest Practices for Postgres PerformanceHow to Design Your PostgreSQL Database: Two Schema ExamplesBest Practices for PostgreSQL Database OperationsHow to Manage Your Data With Data Retention PoliciesBest Practices for PostgreSQL Data AnalysisBest Practices for PostgreSQL AggregationBest Practices for Postgres Database ReplicationBest Practices for Postgres Data ManagementHow to Use a Common Table Expression (CTE) in SQLHow to Use PostgreSQL for Data NormalizationTesting Postgres Ingest: INSERT vs. Batch INSERT vs. COPYBest Practices for Postgres SecurityHow to Handle High-Cardinality Data in PostgreSQLPostgreSQL Compression: Every Option, When To Use Each, and What To Expect
The Best PostgreSQL Extensions for Analytics Workloads: A Field GuidePostgreSQL Extensions: amcheckPostgreSQL 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-osspTurning PostgreSQL Into a Vector Database With pgvector
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
Meter Data Management: Why AMI Interval Data Breaks Legacy MDM SystemsGeofencing and Driver Behavior Analytics: How to Store Both in One DatabaseWhich Database for a Digital Twin? Digital Twin Database Options ComparedGrid Modernization: Why the Data Layer Decides Whether It WorksFleet Telemetry Database: How to Store and Query Vehicle Sensor Data at ScaleUnderstanding IoT (Internet of Things)A Beginner’s Guide to IIoT and Industry 4.0DERMS Database: Solving the Single Source of DER Data ProblemForecasting the Physical World: Foundation Models for Predictive MaintenanceBuilding Energy Management System: The Data Layer Behind Energy Monitoring, Sub-Metering, and M&VSmart Building Analytics: Turning BMS Telemetry Into Occupancy, Energy, and HVAC InsightEV Charging Load ManagementBuilding Management System Database: Architecture for BACnet, Modbus, and Smart Building Sensor Data at ScaleSmart Grid Data Platform: Architecting for SCADA, AMI, PMU, and DERMS Data at ScaleDigital Twin Architecture: The Database and Data Model Behind a Digital TwinCAN Bus Data Logger: Decoding DBC and J1939 Signals into PostgresPredictive Maintenance Database Architecture: Storing and Querying Sensor Data for Failure PredictionPhysical AI Telemetry: Database Architecture for Autonomous-Vehicle FleetsPlant Historian: What It Captures and Where the Analytics Layer BeginsManufacturing 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?EV 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 StackData 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 TableStoring 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 SearchWhat Is Vector Search? Text-to-SQL: A Developer’s Zero-to-Hero GuideWhen Should You Use Full-Text Search vs. Vector Search?HNSW vs. DiskANNVector Search vs Semantic SearchBuilding AI Agents with Persistent Memory: A Unified Database ApproachNearest 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
PostgreSQL OLTP: Transactions, Scale, and the Architecture That Makes It WorkHow to Choose an OLAP Database: A Practical Decision Guide (2026)Data Analytics vs. Real-Time Analytics: How to Pick Your Database (and Why It Should Be PostgreSQL)How to Choose a Real-Time Analytics DatabaseColumnar Databases vs. Row-Oriented Databases: Which to Choose?What Is the Best Database for Real-Time AnalyticsPostgreSQL as a Real-Time Analytics DatabaseUnderstanding OLAP: What It Is, How It Differs From OLTP, and Running It on PostgreSQLHow 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
5 Ways to Monitor Your PostgreSQL DatabaseHow to Migrate Your Data to Timescale (3 Ways)Postgres TOAST vs. Timescale CompressionBuilding Python Apps With PostgreSQL: A Developer's GuideData Visualization in PostgreSQL With Apache SupersetMore Time-Series Data Analysis, Fewer Lines of Code: Meet HyperfunctionsIs Postgres Partitioning Really That Hard? An Introduction To HypertablesPostgreSQL Materialized Views and Where to Find ThemTime-Series Downsampling: The Complete Guide to Tiered Data Resolution in SQLContinuous Aggregates: Incremental Materialized Views for Time-Series DataComplete Guide: Migrating from MongoDB to Tiger Data (Step-by-Step)Timescale Tips: Testing Your Chunk Size
Postgres cheat sheet
HomeAlternativesTime-series basicsData Center & Infrastructure TelemetryPostgres basicsPostgres guidesPostgres best practices
Home
Tiger MCP vs. a Generic Postgres MCP Server
Time Series Forecasting with PostgreSQL: Methods, SQL Examples, and When to Use PythonTime-Series Analysis and Forecasting With Python Why Consider Using PostgreSQL for Time-Series Data?Time-Series Analysis in RWhat Is Temporal Data?Understanding Autoregressive Time-Series ModelingAlternatives to TimescaleStationary Time-Series AnalysisWhat Are Open-Source Time-Series Databases—Understanding Your OptionsIs Your Data Time Series? Data Types Supported by PostgreSQL and TimescaleUnderstanding Database Workloads: Variable, Bursty, and Uniform PatternsThe Best Time-Series Databases Compared (2026)Time Series Anomaly Detection: Methods, SQL, and Real-Time ImplementationAWS Timestream Alternatives: Your Migration Options After LiveAnalyticsTime-Series Database: What It Is, How It Works, and When You Need OneWhat 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 PythonCreating a Fast Time-Series Graph With Postgres Materialized Views
OpenTelemetry Backend: Choosing Metrics Storage That Doesn't Lock You InGPU Cluster Monitoring: The Database Behind AI Infrastructure TelemetryWhat 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
Understanding PostgreSQLUnderstanding SQL Aggregate FunctionsUnderstanding the rank() and dense_rank() Functions in PostgreSQLUnderstanding percentile_cont() and percentile_disc() in PostgreSQLStructured vs. Semi-Structured vs. Unstructured Data in PostgreSQLOptimizing Your Database: A Deep Dive into PostgreSQL Data TypesPostgres Cheat SheetHow to Address ‘Error: Could Not Resize Shared Memory Segment’ Understanding the Postgres extract() FunctionUnderstanding FROM in PostgreSQL (With Examples)How to Install PostgreSQL on LinuxHow to Install PostgreSQL on MacOSUnderstanding FILTER in PostgreSQL (With Examples)Understanding HAVING in PostgreSQL (With Examples)5 Common Connection Errors in PostgreSQL and How to Solve ThemUnderstanding GROUP BY in PostgreSQL (With Examples)How to Fix No Partition of Relation Found for Row in Postgres DatabasesUnderstanding LIMIT in PostgreSQL (With Examples)How to Fix Transaction ID Wraparound ExhaustionUnderstanding ORDER BY in PostgreSQL (With Examples)Understanding PostgreSQL FunctionsUnderstanding WINDOW in PostgreSQL (With Examples)Understanding PostgreSQL WITHIN GROUPPostgreSQL Mathematical Functions: Enhancing Coding EfficiencyUnderstanding DISTINCT in PostgreSQL (With Examples)Understanding WHERE in PostgreSQL (With Examples)Understanding OFFSET in PostgreSQL (With Examples)Understanding the Postgres string_agg FunctionUnderstanding PostgreSQL SELECTWhat Characters Are Allowed in PostgreSQL Strings?What Is Data Transformation, and Why Is It Important?What Is Data Compression and How Does It Work?Using PostgreSQL UPDATE With JOINUnderstanding PostgreSQL User-Defined FunctionsUnderstanding Foreign Keys in PostgreSQLData Processing With PostgreSQL Window FunctionsUnderstanding PostgreSQL Date and Time FunctionsWhat Is a PostgreSQL Full Outer Join?What Is a PostgreSQL Inner Join?What Is a PostgreSQL Left Join? And a Right Join?PostgreSQL Join Type TheoryA Guide to PostgreSQL ViewsStrategies for Improving Postgres JOIN PerformanceUnderstanding PostgreSQL's COALESCE FunctionUnderstanding PostgreSQL Array FunctionsUnderstanding PostgreSQL Conditional FunctionsUsing PostgreSQL String Functions for Improved Data AnalysisPostgreSQL vs. Cassandra: The Decision Framework for Time-Series and Write-Heavy WorkloadsPostgreSQL Joins : A SummaryWhat Is a PostgreSQL Cross Join?Data Partitioning: What It Is and Why It MattersSelf-Hosted or Cloud Database? A Countryside Reflection on Infrastructure ChoicesUnderstanding ACID Compliance
Connect Your AI Coding Agent to Tiger Cloud: Setup for Cursor, Claude Code, VS Code, and MoreHow to Monitor and Optimize PostgreSQL Index PerformanceGuide to PostgreSQL PerformancePostgreSQL Performance Tuning: Designing and Implementing Your Database SchemaPostgreSQL Performance Tuning: Key ParametersPostgreSQL Performance Tuning: Optimizing Database IndexesDetermining the Optimal Postgres Partition SizeWhen to Consider Postgres PartitioningAn Intro to Data Modeling on PostgreSQLDesigning Your Database Schema: Wide vs. Narrow Postgres TablesGuide to PostgreSQL Database OperationsBest Practices for Time-Series Data Modeling: Single or Multiple Partitioned Table(s) a.k.a. Hypertables Best Practices for (Time-)Series Metadata Tables A PostgreSQL Database Replication GuideA Guide to Data Analysis on PostgreSQLHow to Query JSONB in PostgreSQLHow to Compute Standard Deviation With PostgreSQLPostgreSQL Performance Tuning: How to Size Your DatabaseSQL/JSON Data Model and JSON in SQL: A PostgreSQL PerspectiveUnderstanding PostgreSQL TablespacesTop PostgreSQL Drivers for PythonPg_partman vs. Hypertables for Postgres PartitioningExplaining PostgreSQL EXPLAINGuide to PostgreSQL Database DesignHow PostgreSQL Data Aggregation WorksBuilding a Scalable DatabaseA Guide to pg_restore (and pg_restore Example)How to Index JSONB Columns in PostgreSQLWhat Is Audit Logging and How to Enable It in PostgreSQLOptimizing Array Queries With GIN Indexes in PostgreSQLHow to Reduce Bloat in Large PostgreSQL TablesGuide to PostgreSQL SecurityHow to Query JSON Metadata in PostgreSQLRecursive Query in SQL: What It Is, and How to Write OneNavigating Growing PostgreSQL Tables With Partitioning (and More)What Is a PostgreSQL Temporary View?How to Use PostgreSQL for Data TransformationHandling Large Objects in PostgresHow to Use Psycopg2: The PostgreSQL Adapter for PythonA Guide to Scaling PostgreSQLAWS 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 ApplicationsGuide to Postgres Data Management
Time-Series Database High Availability and Disaster RecoveryBest Practices for Scaling PostgreSQLHow to Store Video in PostgreSQL Using BYTEABest Practices for Postgres PerformanceHow to Design Your PostgreSQL Database: Two Schema ExamplesBest Practices for PostgreSQL Database OperationsHow to Manage Your Data With Data Retention PoliciesBest Practices for PostgreSQL Data AnalysisBest Practices for PostgreSQL AggregationBest Practices for Postgres Database ReplicationBest Practices for Postgres Data ManagementHow to Use a Common Table Expression (CTE) in SQLHow to Use PostgreSQL for Data NormalizationTesting Postgres Ingest: INSERT vs. Batch INSERT vs. COPYBest Practices for Postgres SecurityHow to Handle High-Cardinality Data in PostgreSQLPostgreSQL Compression: Every Option, When To Use Each, and What To Expect
The Best PostgreSQL Extensions for Analytics Workloads: A Field GuidePostgreSQL Extensions: amcheckPostgreSQL 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-osspTurning PostgreSQL Into a Vector Database With pgvector
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
Meter Data Management: Why AMI Interval Data Breaks Legacy MDM SystemsGeofencing and Driver Behavior Analytics: How to Store Both in One DatabaseWhich Database for a Digital Twin? Digital Twin Database Options ComparedGrid Modernization: Why the Data Layer Decides Whether It WorksFleet Telemetry Database: How to Store and Query Vehicle Sensor Data at ScaleUnderstanding IoT (Internet of Things)A Beginner’s Guide to IIoT and Industry 4.0DERMS Database: Solving the Single Source of DER Data ProblemForecasting the Physical World: Foundation Models for Predictive MaintenanceBuilding Energy Management System: The Data Layer Behind Energy Monitoring, Sub-Metering, and M&VSmart Building Analytics: Turning BMS Telemetry Into Occupancy, Energy, and HVAC InsightEV Charging Load ManagementBuilding Management System Database: Architecture for BACnet, Modbus, and Smart Building Sensor Data at ScaleSmart Grid Data Platform: Architecting for SCADA, AMI, PMU, and DERMS Data at ScaleDigital Twin Architecture: The Database and Data Model Behind a Digital TwinCAN Bus Data Logger: Decoding DBC and J1939 Signals into PostgresPredictive Maintenance Database Architecture: Storing and Querying Sensor Data for Failure PredictionPhysical AI Telemetry: Database Architecture for Autonomous-Vehicle FleetsPlant Historian: What It Captures and Where the Analytics Layer BeginsManufacturing 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?EV 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 StackData 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 TableStoring 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 SearchWhat Is Vector Search? Text-to-SQL: A Developer’s Zero-to-Hero GuideWhen Should You Use Full-Text Search vs. Vector Search?HNSW vs. DiskANNVector Search vs Semantic SearchBuilding AI Agents with Persistent Memory: A Unified Database ApproachNearest 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
PostgreSQL OLTP: Transactions, Scale, and the Architecture That Makes It WorkHow to Choose an OLAP Database: A Practical Decision Guide (2026)Data Analytics vs. Real-Time Analytics: How to Pick Your Database (and Why It Should Be PostgreSQL)How to Choose a Real-Time Analytics DatabaseColumnar Databases vs. Row-Oriented Databases: Which to Choose?What Is the Best Database for Real-Time AnalyticsPostgreSQL as a Real-Time Analytics DatabaseUnderstanding OLAP: What It Is, How It Differs From OLTP, and Running It on PostgreSQLHow 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
5 Ways to Monitor Your PostgreSQL DatabaseHow to Migrate Your Data to Timescale (3 Ways)Postgres TOAST vs. Timescale CompressionBuilding Python Apps With PostgreSQL: A Developer's GuideData Visualization in PostgreSQL With Apache SupersetMore Time-Series Data Analysis, Fewer Lines of Code: Meet HyperfunctionsIs Postgres Partitioning Really That Hard? An Introduction To HypertablesPostgreSQL Materialized Views and Where to Find ThemTime-Series Downsampling: The Complete Guide to Tiered Data Resolution in SQLContinuous Aggregates: Incremental Materialized Views for Time-Series DataComplete Guide: Migrating from MongoDB to Tiger Data (Step-by-Step)Timescale Tips: Testing Your Chunk Size
Postgres cheat sheet
Tiger Data

Products

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

Industry

  • Data Centers
  • Energy & Utilities
  • Oilfield Services
  • 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
  • Oilfield Services
  • 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

Strategic Partner with Inductive Automation — Ignition

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

Tiger Data

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

Privacy preferencesLegalPrivacySitemap

By Tiger Data Team

Updated at May 26, 2026

Table of contents

    How to Migrate from AWS Timestream to PostgreSQL: A Technical Guide

    How to Migrate from AWS Timestream to PostgreSQL: A Technical Guide

    By Tiger Data Team

    Updated at May 26, 2026

    AWS Timestream LiveAnalytics closed to new customers in June 2025. Engineers who built time-series workloads on LiveAnalytics are now in active migration research. This guide is for that audience: engineers who have decided to move off Timestream and want a concrete technical path to PostgreSQL on Tiger Cloud.

    Full disclosure: Tiger Data publishes this guide and sells Tiger Cloud. We think PostgreSQL is the right destination for most Timestream migrations. Where the InfluxDB path fits your workload better, we'll tell you.

    This guide covers schema translation, data export and ingest, query rewrites from Timestream Query Language (TQL) to TimescaleDB SQL, Grafana dashboard migration, a cardinality audit, Tiger Cloud setup, and a pre/during/post cutover checklist. It does not cover migrating to AWS Timestream for InfluxDB. For a broader alternatives comparison, see AWS Timestream Alternatives: Your Migration Options After LiveAnalytics.

    Should you migrate to PostgreSQL or Timestream for InfluxDB?

    AWS's default recommendation for LiveAnalytics departures is Timestream for InfluxDB. Engineers reading migration documentation will have seen this. It is worth addressing directly before walking through technical steps.

    The choice comes down to three questions.

    Cardinality. AWS's own guidance suggests the InfluxDB path is best suited to workloads with fewer than approximately 10 million unique series keys. Engineers running high-cardinality industrial IoT workloads, where the number of unique device/sensor/region combinations grows into the tens or hundreds of millions, may hit that ceiling on the InfluxDB path. Tiger Cloud on PostgreSQL has no built-in series cardinality limit. Cardinality is a schema design and indexing concern, not a hard system ceiling.

    SQL compatibility. Timestream for InfluxDB uses InfluxQL and Flux. If your engineering team's tooling, ORM layers, BI tools, or data pipelines expect PostgreSQL-compatible SQL, the InfluxDB path adds a query language migration on top of the database migration. That is a real cost.

    Ecosystem breadth. PostgreSQL brings JOIN support, foreign keys, PostGIS for geospatial data, pgvector for ML embeddings, pg_cron for scheduled jobs, row-level security, and the full pg_* extension ecosystem. Timestream for InfluxDB provides none of these.

    Use this table to decide:

    Choose Timestream for InfluxDB if...

    Choose Tiger Cloud (PostgreSQL) if...

    You already use InfluxQL or Flux

    Your team knows SQL and wants PostgreSQL compatibility

    Your cardinality is under ~10M series

    Your workload exceeds ~10M unique series

    You want to stay in the AWS managed service ecosystem

    You need JOIN support, PostGIS, pgvector, or other PostgreSQL extensions

    You don't need relational joins or PostgreSQL extensions

    You use Grafana with a PostgreSQL data source

    You want a cloud-portable database not locked to AWS infrastructure

    Use this table to find the right path before investing in migration steps that don't fit your workload.

    Understanding the Timestream data model

    Before you can map Timestream schema to PostgreSQL, you need to understand what Timestream's model actually is. Three concepts matter:

    Tables. Timestream tables are not equivalent to PostgreSQL tables. Each table has a fixed structure: a time column (always a timestamp), dimension columns (string key-value metadata), and measure columns (the actual metric values).

    Dimensions. High-cardinality string attributes that identify the source of a measurement, such as device_id, region, and sensor_type. Timestream indexes dimensions for fast filtering but stores them as strings only.

    Measures. The time-varying values you are actually recording. A Timestream record can contain multiple measure columns (multi-measure records) or a single measure per row (single-measure records, the older format). You may have either format depending on when the table was created.

    Before starting migration, run DESCRIBE TABLE in TQL to retrieve the effective schema for each table you are migrating. Timestream lacks traditional DDL, so your schema may not be documented elsewhere.

    A sample Timestream table for device telemetry looks like this:

    Table: device_metrics time (TIMESTAMP) device_id (DIMENSION, VARCHAR) region (DIMENSION, VARCHAR) sensor_type (DIMENSION, VARCHAR) temperature (MEASURE, DOUBLE) pressure (MEASURE, DOUBLE) battery_pct (MEASURE, BIGINT)

    The mapping to PostgreSQL columns is not a one-to-one translation, which is where most migration plans go wrong on the first attempt.

    Mapping Timestream schema to PostgreSQL

    Getting the schema translation right before you write any migration code saves significant rework. This is where to start.

    The core mapping rule: Timestream dimensions become PostgreSQL columns (text or varchar). Timestream measures become PostgreSQL columns with matching data types. The Timestream time column becomes the TimescaleDB hypertable partition key (timestamptz).

    Data type mapping:

    Timestream type

    PostgreSQL type

    Notes

    TIMESTAMP

    TIMESTAMPTZ

    Always use timezone-aware timestamps for time-series data

    VARCHAR (dimension)

    TEXT

    Dimensions are always string; map directly

    DOUBLE

    DOUBLE PRECISION

    Standard float8

    BIGINT

    BIGINT

    Direct mapping

    BOOLEAN

    BOOLEAN

    Direct mapping

    Multi-measure record

    Multiple columns

    Each measure becomes its own column

    PostgreSQL DDL example. Here is the hypertable equivalent of the Timestream table shown above:

    CREATE TABLE device_metrics ( time TIMESTAMPTZ NOT NULL, device_id TEXT NOT NULL, region TEXT, sensor_type TEXT, temperature DOUBLE PRECISION, pressure DOUBLE PRECISION, battery_pct BIGINT ); SELECT create_hypertable('device_metrics', by_range('time'));

    The create_hypertable() call converts the standard PostgreSQL table into a TimescaleDB hypertable, enabling automatic time-based partitioning. From that point on, it behaves like a normal PostgreSQL table for reads and writes.

    Multi-measure vs single-measure records. Multi-measure records (where each row contains all measure values) translate cleanly to the schema above. Single-measure records (the older format, where each row contains a single measure_name value and a single measure_value) require a pivot during migration. Multiple Timestream rows with different measure_name values for the same timestamp and device must be combined into a single PostgreSQL row. The most practical approach is GROUP BY + conditional aggregation during the S3 export processing step, or batching at the application level during ingest.

    Cardinality design note. In Timestream, dimension cardinality is managed by the service. In PostgreSQL, workloads with very high-cardinality dimension values (tens of millions of unique device_id strings) benefit from a lookup table pattern: store device_id as an integer foreign key referencing a separate devices table rather than repeating long string values in every row. This is an optional optimization for the largest-scale workloads, not a requirement for getting started.

    Exporting your data from AWS Timestream

    Timestream supports two export mechanisms:

    1. AWS Data Export (recommended for large datasets): exports to S3 as Parquet or CSV via a managed export job. Parquet is the better choice for large historical exports because of its columnar compression.

    2. Scheduled queries with UNLOAD: TQL-based export to S3, useful for filtered or transformed exports but less convenient for full-table bulk export.

    For most migrations, use the AWS Data Export feature. The output lands in S3 as columnar Parquet files with the original column structure intact. Before writing your ingest step, verify how the time column is formatted in the export output (epoch milliseconds or ISO 8601), because this affects how you parse it during ingest.

    Chunk your exports by time. For large historical datasets, export in time-bounded chunks (by month or quarter) rather than a single full-table export. Timestream's query-side has memory and timeout constraints that can cause full-table exports to fail or produce incomplete results on large tables.

    Dual-write during cutover. Timestream does not support continuous replication to an external destination. During the migration period, you will need dual-write: application writes go to both Timestream and Tiger Cloud simultaneously until you validate the cutover. The cutover checklist at the end of this guide covers the dual-write pattern in detail.

    Ingesting into Tiger Cloud

    Once your Timestream export lands in S3, you have three ingestion paths:

    COPY from S3 (recommended for historical data). The PostgreSQL COPY command reads CSV files directly. For Parquet files, convert to CSV first using a lightweight tool (DuckDB is effective for this), then COPY:

    COPY device_metrics (time, device_id, region, sensor_type, temperature, pressure, battery_pct) FROM '/path/to/exported_chunk.csv' WITH (FORMAT CSV, HEADER true);

    For large datasets, parallelize the COPY across time-bounded chunks. TimescaleDB hypertables accept parallel COPY operations without coordination issues because each chunk lands in a separate partition.

    Standard PostgreSQL INSERT for ongoing writes (dual-write period). TimescaleDB hypertables accept standard PostgreSQL INSERT statements. No special syntax is required. This is an important point for engineers unfamiliar with TimescaleDB: it is PostgreSQL. Any PostgreSQL-compatible driver, including psycopg2, asyncpg, pgx, JDBC, and pg for Node.js, connects and writes using the same syntax your application already uses.

    INSERT INTO device_metrics (time, device_id, region, sensor_type, temperature, pressure, battery_pct) VALUES (NOW(), 'dev-001', 'us-east-1', 'thermostat', 22.4, 101.3, 87);

    Tiger Cloud connection string. Use the standard PostgreSQL URI format:

    postgresql://username:password@<service-host>:5432/database_name

    Find your specific service host in the Tiger Cloud console under connection settings. Tiger Cloud exposes a standard PostgreSQL wire protocol endpoint, so any PostgreSQL-compatible driver connects without modification.

    Enable Hypercore compression after ingest. Once your historical data is loaded and validated, enable Hypercore compression on the hypertable. This is a one-command operation:

    ALTER TABLE device_metrics SET ( timescaledb.compress, timescaledb.compress_segmentby = 'device_id' ); SELECT add_compression_policy('device_metrics', INTERVAL '7 days');

    For time-series workloads, Hypercore compression typically reduces storage by 90% or more for historical data. Timestream's pricing model accumulates storage costs without equivalent compression transparency, which is a difference that compounds over time on large historical datasets.

    Rewriting Timestream queries in PostgreSQL

    TQL and PostgreSQL SQL handle the same operations differently. Here are the most common patterns side by side:

    Query pattern

    Timestream TQL

    TimescaleDB SQL

    Recent records

    SELECT * FROM "db"."table" WHERE time BETWEEN ago(1h) AND now()

    SELECT * FROM device_metrics WHERE time > NOW() - INTERVAL '1 hour'

    Time-bucket aggregation (1-minute bins)

    SELECT bin(time, 1m), avg(temperature) FROM ... GROUP BY 1

    SELECT time_bucket('1 minute', time) AS bucket, avg(temperature) FROM device_metrics GROUP BY 1

    Filter by dimension (single-measure schema)

    WHERE measure_name = 'temperature' AND "device_id" = 'dev-001'

    WHERE device_id = 'dev-001' (measure is now a column, not a row-level filter)

    Latest value per device

    Subquery with ORDER BY time DESC LIMIT 1 per device

    SELECT DISTINCT ON (device_id) device_id, time, temperature FROM device_metrics ORDER BY device_id, time DESC

    Gap fill

    No native gap fill in TQL

    SELECT time_bucket_gapfill('5 minutes', time), locf(avg(temperature)) FROM device_metrics GROUP BY 1

    Multi-day downsampling

    bin(time, 1d)

    time_bucket('1 day', time) (also a candidate for a continuous aggregate)

    Single-measure record note. If your Timestream schema used single-measure records, the WHERE measure_name = 'temperature' filter in TQL has no direct equivalent in PostgreSQL. That transformation happens at the schema level during migration: each distinct measure_name value becomes its own column. Once the schema is correct, you reference the column directly.

    Continuous aggregates. Timestream's scheduled queries for pre-computed aggregations have a functional equivalent in TimescaleDB: continuous aggregates. They refresh incrementally in the background, updating only what changed since the last refresh, and are queryable like a standard view. Engineers who relied on Timestream scheduled queries for dashboard performance should look at continuous aggregates as their replacement. See How to Get Faster Aggregated Data in PostgreSQL for the implementation pattern.

    Migrating your Grafana dashboards

    Engineers running Timestream almost always use Grafana via the official Grafana Amazon Timestream data source plugin. Switching databases requires switching data sources and rewriting panel queries. This is panel-by-panel work. There is no bulk replace tool in Grafana.

    Step 1: Add the PostgreSQL data source. In Grafana, go to Settings > Data Sources > Add data source > PostgreSQL. Enter the Tiger Cloud connection string. Test the connection before touching any dashboards.

    Step 2: Inventory affected dashboards. Identify which dashboards use the Timestream data source. Grafana's data source usage report helps here, but manual review is often faster for smaller installations.

    Step 3: Rewrite panel queries. For each panel, rewrite the TQL query to PostgreSQL SQL. Use the query rewrite table above as reference. The key difference in Grafana's PostgreSQL data source: use $__timeFilter(time) as the time range macro rather than Timestream's equivalent. Example:

    -- Timestream panel query SELECT bin(time, $__interval), avg(temperature) FROM "mydb"."device_metrics" WHERE $__timeFilter(time) AND "device_id" = '$device' GROUP BY 1 -- PostgreSQL panel query SELECT $__timeGroupAlias(time, $__interval), avg(temperature) FROM device_metrics WHERE $__timeFilter(time) AND device_id = '$device' GROUP BY 1

    Step 4: Update variable queries. Dashboard variable queries (the dropdowns that filter by device or region) must also be rewritten. A TQL variable query for a device list becomes:

    SELECT DISTINCT device_id FROM device_metrics ORDER BY 1

    Format compatibility. Grafana's time-series panel expects a time column and value columns. TimescaleDB's query output matches this expectation natively. Your visualization types (time series, stat, table) do not need to change.

    Cardinality audit: is your workload right for this migration?

    Timestream manages cardinality at the service level. Engineers rarely had to think about it. PostgreSQL manages cardinality at the table and index level, so schema design choices matter here.

    Before committing to a migration path, measure your current series count. Run this in TQL over a 24-hour window (full-table cardinality queries on large tables are expensive and may time out):

    SELECT COUNT(DISTINCT device_id, region, sensor_type) AS approx_series_count FROM "mydb"."device_metrics" WHERE time BETWEEN ago(24h) AND now()

    Interpreting the result:

    • Under ~1 million unique series: Standard PostgreSQL column design. No special considerations.

    • 1 million to 10 million series: Consider storing device_id as an integer foreign key referencing a devices lookup table rather than repeating full strings in every row.

    • Over 10 million series: Tiger Cloud handles this natively through hypertable partitioning and index design. The InfluxDB path is not recommended at this scale per AWS's own service limit documentation.

    Tiger Cloud on PostgreSQL has no built-in series cardinality limit. For high-cardinality industrial IoT workloads, this is the meaningful difference between the two migration paths.

    Tiger Cloud setup checklist

    This is a pre-migration setup reference, not a substitute for Tiger Cloud documentation. Where the docs have the precise details, we point you there.

    Step 1: Create a Tiger Cloud service. Select a region close to your application layer. For IoT and telemetry workloads, region proximity matters for write latency.

    Step 2: Create your database and user.

    CREATE DATABASE telemetry_db; CREATE USER app_user WITH PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE telemetry_db TO app_user;

    Step 3: Enable the TimescaleDB extension.

    CREATE EXTENSION IF NOT EXISTS timescaledb;

    Step 4: Create the hypertable. Use the DDL from the schema mapping section. One week is a reasonable starting chunk interval for high-ingest IoT workloads:

    SELECT create_hypertable('device_metrics', by_range('time', INTERVAL '1 week'));

    Step 5: Enable Hypercore compression. Apply compression after validating ingest. Use the command from the ingestion section.

    Step 6: Set up a data retention policy (equivalent to Timestream's magnetic store retention):

    SELECT add_retention_policy('device_metrics', INTERVAL '90 days');

    How to migrate from AWS Timestream: pre-migration, cutover, and validation checklist

    Use this as a team coordination document during the migration. Share it with whoever owns the application-layer changes and whoever owns the Grafana dashboards before you start.

    Before you start

    • Run the cardinality audit on all Timestream tables being migrated

    • Document all Timestream tables: dimension columns, measure columns, data types, record format (single-measure or multi-measure)

    • Identify all application code writing to Timestream (search for WriteRecords API calls and Timestream SDK imports)

    • Identify all application code reading from Timestream (TQL queries, Grafana panels, scheduled queries, reports)

    • Identify all downstream consumers (Grafana dashboards, data pipelines, scheduled aggregation jobs)

    • Set up Tiger Cloud service and validate connection from your application environment

    • Create hypertable schema and run a test ingest with a small data sample (one day of data)

    • Run a sample TQL query and its PostgreSQL equivalent on test data; verify consistent results

    During cutover

    • Enable dual-write: application writes to both Timestream and Tiger Cloud simultaneously

    • Export Timestream historical data to S3 in time-bounded chunks

    • Ingest historical data into Tiger Cloud hypertable via COPY

    • Run data validation queries on both systems: row counts by time bucket, aggregate comparisons, spot checks on specific device/dimension combinations

    • Migrate Grafana dashboards panel-by-panel: update data source, rewrite TQL to PostgreSQL SQL

    • Run Grafana dashboards against Tiger Cloud data for at least 24 hours before cutting over; compare to Timestream dashboards visually

    After cutover

    • Disable writes to Timestream via application configuration or feature flag

    • Verify no active Timestream write calls appearing in application logs

    • Keep Timestream data in read-only mode for 30 days post-cutover as a rollback buffer

    • Monitor Tiger Cloud query performance and storage growth for the first week

    • Enable Hypercore compression on fully ingested historical data chunks

    • Set up the data retention policy on Tiger Cloud (equivalent to Timestream magnetic store retention)

    • Document your rollback procedure: if issues arise within the 30-day buffer window, re-enable Timestream writes and diagnose before proceeding

    Real-world migration: how Octave did it

    Octave is a cleantech company building analytics infrastructure for second-life batteries. They collect and analyze time-series data from batteries across lifecycle stages, and they were running that workload on AWS Timestream.

    Octave migrated to Tiger Data in search of better compression and query performance on historical data at scale. After migration, Octave achieved 26x compression on historical battery telemetry. The migration path they followed matches what this guide describes: export from Timestream, schema translation, ingest into TimescaleDB, and validation against the source data.

    For the full technical account, see the Octave case study and the detailed writeup at How Octave Achieves a High Compression Ratio and Speedy Queries on Historical Data.

    Octave is not an isolated example. Torus, another Tiger Data customer that migrated from Timestream, reported average response times dropping from 800ms to 70ms after migration. TimescaleDB's automatic partition pruning, chunk exclusion, and Hypercore compression give it a structural speed advantage on time-range queries that Timestream, built on a more generalized storage layer, was not designed to match.

    Next steps

    If you are evaluating migration paths before committing to PostgreSQL, start with the AWS Timestream alternatives overview and the best managed time-series databases in 2026 comparison. Both cover the full landscape, including Timestream for InfluxDB, QuestDB, and other options.

    If you have decided on the PostgreSQL path, start a Tiger Cloud trial and run through the setup checklist above with a small data sample before committing to the full migration. Tiger Data's support team is available throughout the trial period.

    FAQ

    What happened to AWS Timestream LiveAnalytics?

    AWS closed LiveAnalytics to new customers in June 2025 and announced end-of-life for the service. The surviving product is Timestream for InfluxDB, which AWS recommends as the default migration path. PostgreSQL on Tiger Cloud is the alternative for teams that need SQL compatibility, higher cardinality support, or the broader PostgreSQL ecosystem.

    Can I migrate from Timestream to PostgreSQL without writing custom ETL code?

    Some custom work is unavoidable. The export via AWS Data Export to S3 is straightforward, and the PostgreSQL ingest via COPY is standard. The custom work is schema mapping (dimensions to columns) and query rewrites (TQL to SQL). Single-measure record schemas also require a pivot step during ingest to consolidate multiple rows into a single PostgreSQL row per timestamp. A single-table Timestream setup with 3 to 5 dimensions and 2 to 3 measures takes roughly 1 to 3 days for a developer familiar with PostgreSQL. Multi-table setups with complex TQL queries take longer.

    How does Timestream's measure_name model map to PostgreSQL columns?

    In Timestream single-measure records, measure_name is a row-level filter. A query that reads WHERE measure_name = 'temperature' selects which metric you are reading from a generic value column. In PostgreSQL, each distinct measure_name value becomes its own column. The schema mapping section above has the full DDL walkthrough and the pivot approach for handling single-measure exports.

    Does Tiger Cloud support the same data volume as Timestream?

    Tiger Cloud is based on PostgreSQL with TimescaleDB, designed for high-ingest time-series workloads. In published benchmarks, TimescaleDB handled significantly higher insert rates than Timestream LiveAnalytics while maintaining faster query performance. Real-world migration results support this: Torus, a Tiger Data customer that migrated from Timestream, reported average query response times dropping from 800ms to 70ms after migration. TimescaleDB's automatic partitioning, Hypercore compression, and chunk exclusion give it a structural speed advantage on time-range queries.

    What is the cardinality limit for Tiger Cloud?

    There is no built-in series cardinality limit equivalent to InfluxDB's approximately 10 million series constraint. Cardinality in PostgreSQL is a schema design and indexing concern, not a hard system ceiling. High-cardinality workloads benefit from the index design choices covered in the schema mapping section, but nothing in Tiger Cloud enforces a series count limit. This is one of the reasons engineers with large industrial IoT workloads choose the PostgreSQL path over Timestream for InfluxDB.

    What Grafana version and data source plugin do I need for Tiger Cloud?

    Tiger Cloud uses a standard PostgreSQL data source. The built-in Grafana PostgreSQL plugin works without modification — no special Tiger Cloud plugin is required. The PostgreSQL data source has been available in Grafana since v2.1 and as of Grafana 10+ supports all features needed for time-series dashboards, including $__timeFilter, $__timeGroupAlias, and $__interval macros.

    How long does the Timestream migration typically take?

    A single table with moderate data and a PostgreSQL-familiar team typically finishes in 1 to 2 weeks including validation. Large multi-table setups with significant application-layer query rewrites may take 4 to 8 weeks. The dual-write period should run at least 24 to 72 hours before hard cutover.

    Can I keep my existing AWS infrastructure while running Tiger Cloud?

    Yes. Tiger Cloud operates independently of AWS infrastructure and is accessible over standard TCP/IP from any cloud environment, including AWS-hosted applications. For latency-sensitive applications, select a Tiger Cloud region close to your application's AWS region. Check Tiger Cloud documentation for current network connectivity options, including VPC peering availability for private connectivity requirements.

    Will my existing PostgreSQL ORMs and drivers work with Tiger Cloud?

    Yes. Tiger Cloud exposes a standard PostgreSQL wire protocol. Any PostgreSQL-compatible driver — including psycopg2, asyncpg, pgx, pg for Node.js, and JDBC — connects using the standard connection URI. Application SQL query code requires no changes beyond replacing the Timestream SDK calls.

    What happens to my Timestream data after I migrate?

    Timestream data is not automatically deleted. Existing tables remain accessible until the LiveAnalytics end-of-life deadline. Keep read access available for at least 30 days post-cutover as a rollback buffer, then archive to S3 before decommissioning. Check AWS Timestream documentation for current end-of-life dates.

    Does Tiger Cloud support Timestream's magnetic store retention behavior?

    Tiger Data does not have a direct magnetic store equivalent. The functional equivalent is a combination of two TimescaleDB features: data retention policies via add_retention_policy(), which automatically drop data older than a specified interval, and Hypercore compression, which reduces storage costs for older data that must be retained. For tiered retention, the standard pattern is continuous aggregates on the raw hypertable plus a retention policy that drops the raw data after a defined window, so the aggregate survives while the raw data ages out.

    Is there a Tiger Data-supported migration tool or does it require manual steps?

    As of May 2026, Tiger Data does not offer an automated Timestream-to-PostgreSQL migration tool. The migration process requires engineer-executed steps: Timestream export, schema translation, PostgreSQL ingest, and query rewrites. Tiger Data's support team is available during the Tiger Cloud trial period for migration assistance. Check Tiger Cloud documentation for the latest available tooling before starting, since this area moves quickly.