TigerData logo
TigerData logo
  • Product

    Tiger Cloud

    Robust elastic cloud platform for startups and enterprises

    Agentic Postgres

    Postgres for Agents

    TimescaleDB

    Postgres for time-series, real-time analytics and events

  • Docs
  • Pricing

    Pricing

    Enterprise Tier

  • Developer Hub

    Changelog

    Benchmarks

    Blog

    Community

    Customer Stories

    Events

    Support

    Integrations

    Launch Hub

  • Company

    Contact us

    About

    Timescale

    Partners

    Security

    Careers

Log InTry for free
Home
Stationary Time-Series AnalysisThe Best Time-Series Databases ComparedTime-Series Analysis and Forecasting With Python Alternatives to TimescaleWhat Are Open-Source Time-Series Databases—Understanding Your OptionsWhy Consider Using PostgreSQL for Time-Series Data?Time-Series Analysis in RAWS Time-Series Database: Understanding Your OptionsWhat Is Temporal Data?What Is a Time Series and How Is It Used?Is Your Data Time Series? Data Types Supported by PostgreSQL and TimescaleUnderstanding Database Workloads: Variable, Bursty, and Uniform PatternsHow 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 Join Type TheoryStructured vs. Semi-Structured vs. Unstructured Data in PostgreSQLUnderstanding PostgreSQLUnderstanding FILTER in PostgreSQL (With Examples)Understanding Foreign Keys in PostgreSQLUnderstanding GROUP BY in PostgreSQL (With Examples)Understanding PostgreSQL User-Defined FunctionsUnderstanding PostgreSQL's COALESCE FunctionUnderstanding SQL Aggregate FunctionsUsing PostgreSQL UPDATE With JOINOptimizing Your Database: A Deep Dive into PostgreSQL Data TypesHow to Install PostgreSQL on LinuxUnderstanding FROM in PostgreSQL (With Examples)How to Address ‘Error: Could Not Resize Shared Memory Segment’ Understanding HAVING in PostgreSQL (With Examples)How to Fix No Partition of Relation Found for Row in Postgres DatabasesHow to Fix Transaction ID Wraparound ExhaustionUnderstanding LIMIT in PostgreSQL (With Examples)Understanding ORDER BY in PostgreSQL (With Examples)Understanding WINDOW in PostgreSQL (With Examples)Understanding PostgreSQL WITHIN GROUPPostgreSQL Mathematical Functions: Enhancing Coding EfficiencyUnderstanding DISTINCT in PostgreSQL (With Examples)Using PostgreSQL String Functions for Improved Data AnalysisData Processing With PostgreSQL Window FunctionsUnderstanding WHERE in PostgreSQL (With Examples)PostgreSQL Joins : A SummaryWhat Is Data Compression and How Does It Work?What Is Data Transformation, and Why Is It Important?How to Install PostgreSQL on MacOS5 Common Connection Errors in PostgreSQL and How to Solve ThemUnderstanding PostgreSQL FunctionsUnderstanding OFFSET in PostgreSQL (With Examples)Understanding PostgreSQL Date and Time FunctionsUnderstanding the Postgres string_agg FunctionWhat Is a PostgreSQL Inner Join?What Is a PostgreSQL Left Join? And a Right Join?A Guide to PostgreSQL ViewsData Partitioning: What It Is and Why It MattersUnderstanding ACID Compliance Understanding percentile_cont() and percentile_disc() in PostgreSQLUnderstanding PostgreSQL Conditional FunctionsUnderstanding PostgreSQL Array FunctionsWhat Characters Are Allowed in PostgreSQL Strings?What Is a PostgreSQL Full Outer Join?What Is a PostgreSQL Cross Join?Understanding PostgreSQL SELECTSelf-Hosted or Cloud Database? A Countryside Reflection on Infrastructure ChoicesStrategies for Improving Postgres JOIN PerformanceUnderstanding the Postgres extract() FunctionUnderstanding the rank() and dense_rank() Functions in PostgreSQL
Pg_partman vs. Hypertables for Postgres PartitioningPostgreSQL Performance Tuning: Designing and Implementing Your Database SchemaPostgreSQL Performance Tuning: Key ParametersPostgreSQL Performance Tuning: Optimizing Database IndexesNavigating Growing PostgreSQL Tables With Partitioning (and More)Top PostgreSQL Drivers for PythonWhen to Consider Postgres PartitioningUnderstanding PostgreSQL TablespacesWhat Is Audit Logging and How to Enable It in PostgreSQLHow to Reduce Bloat in Large PostgreSQL TablesDetermining the Optimal Postgres Partition SizeGuide to PostgreSQL Database OperationsDesigning Your Database Schema: Wide vs. Narrow Postgres TablesBest Practices for (Time-)Series Metadata Tables Guide to Postgres Data ManagementHow to Query JSONB in PostgreSQLHow to Index JSONB Columns in PostgreSQLHow to Monitor and Optimize PostgreSQL Index PerformanceOptimizing Array Queries With GIN Indexes in PostgreSQLSQL/JSON Data Model and JSON in SQL: A PostgreSQL PerspectiveHow to Query JSON Metadata in PostgreSQLA Guide to pg_restore (and pg_restore Example)Handling Large Objects in PostgresPostgreSQL Performance Tuning: How to Size Your DatabaseGuide to PostgreSQL PerformanceAn Intro to Data Modeling on PostgreSQLBest Practices for Time-Series Data Modeling: Single or Multiple Partitioned Table(s) a.k.a. Hypertables What Is a PostgreSQL Temporary View?A PostgreSQL Database Replication GuideHow to Compute Standard Deviation With PostgreSQLHow PostgreSQL Data Aggregation WorksBuilding a Scalable DatabaseA Guide to Scaling PostgreSQLHow to Use PostgreSQL for Data TransformationRecursive Query in SQL: What It Is, and How to Write OneGuide to PostgreSQL Database DesignExplaining PostgreSQL EXPLAINA Guide to Data Analysis on PostgreSQLGuide to PostgreSQL SecurityHow to Use Psycopg2: The PostgreSQL Adapter for Python
Best Practices for Postgres Data ManagementBest Practices for Postgres PerformanceBest Practices for Postgres SecurityHow to Design Your PostgreSQL Database: Two Schema ExamplesBest 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 PoliciesBest Practices for Scaling PostgreSQLHow to Store Video in PostgreSQL Using BYTEAHow to Handle High-Cardinality Data in PostgreSQLHow to Use PostgreSQL for Data NormalizationBest Practices for PostgreSQL AggregationBest Practices for Postgres Database ReplicationHow to Use a Common Table Expression (CTE) in SQL
PostgreSQL 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: Install pg_trgm for Data MatchingPostgreSQL Extensions: Turning PostgreSQL Into a Vector Database With pgvectorPostgreSQL Extensions: Database Testing With pgTAPPostgreSQL Extensions: PL/pgSQLPostgreSQL Extensions: Using PostGIS and Timescale for Advanced Geospatial InsightsPostgreSQL Extensions: Intro to uuid-ossp
PostgreSQL as a Real-Time Analytics DatabaseUnderstanding OLTPWhat Is the Best Database for Real-Time AnalyticsHow to Build an IoT Pipeline for Real-Time Analytics in PostgreSQLHow to Choose a Real-Time Analytics DatabaseOLAP Workloads on PostgreSQL: A GuideHow to Choose an OLAP DatabaseData Analytics vs. Real-Time Analytics: How to Pick Your Database (and Why It Should Be PostgreSQL)Columnar Databases vs. Row-Oriented Databases: Which to Choose?
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 LangChainRetrieval-Augmented Generation With Claude Sonnet 3.5 and PgvectorUnderstanding Semantic SearchWhat Is Vector Search? Vector Search vs Semantic SearchText-to-SQL: A Developer’s Zero-to-Hero GuideNearest Neighbor Indexes: What Are IVFFlat Indexes in Pgvector and How Do They WorkRAG Is More Than Just Vector SearchPostgreSQL Hybrid Search Using Pgvector and CohereImplementing Filtered Semantic Search Using Pgvector and JavaScriptRefining Vector Search Queries With Time Filters in Pgvector: A TutorialBuilding an AI Image Gallery With OpenAI CLIP, Claude Sonnet 3.5, and PgvectorWhen Should You Use Full-Text Search vs. Vector Search?HNSW vs. DiskANN
Understanding IoT (Internet of Things)Storing IoT Data: 8 Reasons Why You Should Use PostgreSQLHow to Choose an IoT DatabaseHow 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 % CompressionA Beginner’s Guide to IIoT and Industry 4.0Why You Should Use PostgreSQL for Industrial IoT DataHow Hopthru Powers Real-Time Transit Analytics From a 1 TB Table Migrating a Low-Code IoT Platform Storing 20M Records/DayMoving Past Legacy Systems: Data Historian vs. Time-Series DatabaseHow 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
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
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
8 Reasons to Choose Timescale as Your InfluxDB Alternative What InfluxDB Got Wrong5 InfluxDB Alternatives for Your Time-Series Data InfluxQL, Flux, and SQL: Which Query Language Is Best? (With Cheatsheet)TimescaleDB vs. InfluxDB: Purpose Built Differently for Time-Series Data
How 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 HyperfunctionsPostgreSQL Materialized Views and Where to Find ThemTimescale Tips: Testing Your Chunk SizeIs Postgres Partitioning Really That Hard? An Introduction To Hypertables5 Ways to Monitor Your PostgreSQL Database
Postgres cheat sheet
HomeTime series basicsPostgres basicsPostgres guidesPostgres best practicesPostgres extensionsPostgres for real-time analytics
Sections

Database design and modeling

An Intro to Data Modeling on PostgreSQLDesigning Your Database Schema: Wide vs. Narrow Postgres TablesBest Practices for Time-Series Data Modeling: Single or Multiple Partitioned Table(s) a.k.a. Hypertables Best Practices for (Time-)Series Metadata Tables Guide to PostgreSQL Database Design

Database replication

A PostgreSQL Database Replication Guide

Data management

Understanding PostgreSQL TablespacesGuide to Postgres Data ManagementHandling Large Objects in Postgres

Data aggregation

How PostgreSQL Data Aggregation Works

Scaling postgres

Building a Scalable DatabaseA Guide to Scaling PostgreSQL

Performance

Schema design

PostgreSQL Performance Tuning: Designing and Implementing Your Database Schema
Guide to PostgreSQL Performance

Performance tuning

PostgreSQL Performance Tuning: Key ParametersPostgreSQL Performance Tuning: Optimizing Database IndexesHow to Reduce Bloat in Large PostgreSQL TablesPostgreSQL Performance Tuning: How to Size Your Database

Partitioning

Determining the Optimal Postgres Partition SizeNavigating Growing PostgreSQL Tables With Partitioning (and More)When to Consider Postgres PartitioningPg_partman vs. Hypertables for Postgres Partitioning

Database tools and libraries

How to Use Psycopg2: The PostgreSQL Adapter for PythonTop PostgreSQL Drivers for Python

Database security

What Is Audit Logging and How to Enable It in PostgreSQLGuide to PostgreSQL Security

Database operations

Guide to PostgreSQL Database Operations

JSON

How to Query JSONB in PostgreSQLHow to Index JSONB Columns in PostgreSQLSQL/JSON Data Model and JSON in SQL: A PostgreSQL PerspectiveHow to Query JSON Metadata in PostgreSQL

Database indexes

How to Monitor and Optimize PostgreSQL Index Performance

Query optimization

Explaining PostgreSQL EXPLAINWhat Is a PostgreSQL Temporary View?Optimizing Array Queries With GIN Indexes in PostgreSQLRecursive Query in SQL: What It Is, and How to Write One

Database backups and restore

A Guide to pg_restore (and pg_restore Example)

Data analysis

A Guide to Data Analysis on PostgreSQLHow to Compute Standard Deviation With PostgreSQL

Data transformation

How to Use PostgreSQL for Data Transformation

Products

Time Series and Analytics AI and Vector Enterprise Plan Cloud Status Support Security Cloud Terms of Service

Learn

Documentation Blog Forum Tutorials Changelog Success Stories Time Series Database

Company

Contact Us Careers About Brand Community Code Of Conduct Events

Subscribe to the Tiger Data Newsletter

By submitting, you acknowledge Tiger Data's Privacy Policy

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

Privacy preferences
LegalPrivacySitemap

Published at Jul 31, 2023

PostgreSQL

Building a Scalable Database

Having a scalable database is essential for developers and businesses struggling with high data volumes, like time-series or time-series-like workloads. Learn what a scalable database is (in general) and how you can scale PostgreSQL (specifically).

What Is a Scalable Database?

A scalable database is a database system that can store more data and handle increasing requests without experiencing significant decreases in performance or availability. As the amount of data and users grows, a scalable database can accommodate both without compromising performance or reliability. It’s a vital tool for developers working on data-intensive applications. 

In business terms, a company is scaling when trying to increase the size, amount, or importance of something. In the developer world, database scalability also involves an element of dimension but requires a compromise between scalability, performance, and consistency. 

In this article, we’ll explore the concept of database scalability, why scalable databases are so important (especially for time-series workloads), and how we can make a relational database, in this case, PostgreSQL, more scalable. 

Why Should You Have a Scalable Database?

Having a scalable database is essential for many reasons. First, it can accommodate your project’s growth. Expanding businesses generate massive amounts of data (such as relentless time-series data) that need to be managed, stored, and analyzed, preferably without slow queries or dashboards. A scalable database will help you avoid these performance bottlenecks.

Second, a scalable database ensures high availability and reliability, preventing crashes and downtime that can upset users. Scalable databases can handle increasing requests while remaining highly available and performant, allowing you to scale your business efficiently. 

So, Who Needs a Scalable Database?

If you identify with one of the following sentences, you probably need your database system to have extra scalability:

  • I can’t ingest my data fast enough.

  • I have high resource usage with peaks—what happens if we scale by 10x?

  • I have too many clients, concurrent queries, etc.

  • I pay too much for storage.

  • I need more storage.

Can you relate? So could we, which is why we came up with Timescale.

How Do You Design a Scalable Database?

Achieving a scalable database design will help your database be more resilient and efficiently handle, query, and store growing amounts of data.

Here are some principles you should keep in mind when designing a scalable database:

  • Use indexes: indexes help speed up queries by creating an index of frequently accessed data. This can significantly improve performance, particularly for large databases. Timescale indexes work just like PostgreSQL indexes, removing much of the guesswork when working with this powerful tool.

  • Partition your data: Partitioning involves dividing a large table into smaller, more manageable parts. This can improve performance by allowing the database to access data more quickly. Read how to optimize and test your data partitions’ size in Timescale.

  • Use buffer cache: In PostgreSQL, buffer caching involves storing frequently accessed data in memory, which can significantly improve performance. This is particularly useful for read-heavy workloads, and while it is always enabled in PostgreSQL, it can be tweaked for optimized performance.

  • Consider data distribution: In distributed databases, data distribution or sharding is an extension of partitioning. It turns the database into smaller, more manageable partitions and then distributes (shards) them across multiple cluster nodes. This can improve scalability by allowing the database to handle more data and traffic. However, sharding also requires more design work up front to work correctly.

  • Or use a load balancer: Sharding and load balancing often conflict unless you use additional tooling. Load balancing involves distributing traffic across multiple servers to improve performance and scalability. A load balancer that routes traffic to the appropriate server based on the workload can do this; however, it will only work for read-only queries.

  • Optimize queries: Optimizing queries involves tuning them to improve performance and reduce the load on the database. This can include rewriting queries, creating indexes, and partitioning data.

What About Horizontal Database Scalability vs. Vertical Scalability?

Horizontal scalability or scaling out

Horizontal database scaling or scaling out generally involves adding more nodes to a database cluster to distribute the load and increase its processing power and storage capacity.

You can take the following steps to increase your database scalability horizontally:

  • Use a sharding (data distribution) strategy: You can partition a large database into distributed pieces called shards. By having each shard distributed to a different cluster node, your database will be able to accommodate more data and requests.

  • Load balancing: You use a load balancer to help distribute traffic across multiple database servers or clusters, which will also ensure the workload is evenly distributed across nodes in the cluster. Load balancing on read replicas can be an alternative, although it has issues like replication latency. Clusters, however, can be load balanceable or not.

  • Monitor and optimize: As your database cluster scales, it is vital that you monitor its performance and optimize its configuration—fine-tune settings such as buffer cache size, network settings, or database configurations. Read how you can optimize your ingest rate in Timescale.

Vertical scalability or scaling up

Vertical scaling or scaling up involves increasing the processing power and storage capacity of a single node in a database server. It’s a cost-effective (but not always simple) way to manage growing data volumes and can complement horizontal scaling.

Here’s how you vertically scale a database:

  • Upgrade hardware: Upgrading the hardware of a database server is one way to improve its power and storage capacity. You can add more RAM, increase the number of CPU cores, or upgrade to a faster storage system. However, this may take months of planning and is not necessarily easy or fast to implement.

  • Use database partitioning. Database partitioning involves dividing a large table into smaller, more manageable parts. This can improve performance by allowing the database to access data more quickly and reducing the amount of storage required by the database.

  • Use database indexing: Indexing can help speed up database queries by creating an index of frequently accessed data. This can significantly improve performance, particularly for large databases.

💡Timescale Tip Use compression: compression can help reduce the amount of storage space, allowing Timescale to store more data on the same hardware while speeding up your queries. Want to learn more about compression from the developers who use it? Read how Ndustrial achieved 97 % compression.

Are Relational Databases Scalable?

Yes, there are several scalable relational database management systems (RDBMS) available.

These systems store data in tables with a well-defined schema and support a relational data management model. PostgreSQL and Timescale are two examples of RDBMS. 

PostgreSQL is an open-source and highly scalable RDBMS that can be horizontally or vertically scaled. It supports advanced features such as partitioning and indexing and is known for its high data integrity and reliability. Built on PostgreSQL, Timescale not only works like PostgreSQL; it is PostgreSQL under the hood and dramatically expands its possibilities.

Why Use Timescale to Scale PostgreSQL

Depending on your specific needs and requirements, there are several ways to scale PostgreSQL. You can use the vertical and horizontal scalability approaches we mentioned, but the most straightforward way is to use Timescale. Here’s how Timescale helps scale PostgreSQL:

  • Our automatic partitioning enables you to manage relentless time-series data.

  • Timescale can compress older partitions, reducing storage needs.

  • The data partitions (or chunks, as we call them) can be tiered, further reducing storage needs.

  • Timescale can optimize queries by extending the planning and execution of PostgreSQL queries.

  • Continuous aggregates (or automatically updated incremental materialized views) allow you to create always-consistent materialized views. Some queries may run more than a thousand times faster.

  • Timescale allows you to balance your load and scale your compute horizontally through read replicas.

The fastest and most efficient way to scale your PostgreSQL database is to choose Timescale. Sign up for a free 30-day trial and experience Timescale’s supercharged PostgreSQL—no credit card required.

On this page