Tiger Cloud: Performance, Scale, Enterprise, Free
Self-hosted products
MST
Replace a standard Postgres relational table with a hypertable that is partitioned on a single dimension. To create a new hypertable, best practice is to call hypertable-create-table.
A hypertable is a Postgres table that automatically partitions your data by time. A dimension defines the way your
data is partitioned. All actions work on the resulting hypertable. For example, ALTER TABLE, and SELECT.
If the table to convert already contains data, set migrate_data to TRUE.
However, this may take a long time and there are limitations when the table contains foreign
key constraints.
You cannot run create_hypertable() on a table that is already partitioned using
declarative partitioning or inheritance
. The time column must be defined
as
NOT NULL. If this is not already specified on table creation, create_hypertable automatically adds
this constraint on the table when it is executed.
This page describes the generalized hypertable API introduced in TimescaleDB v2.13.
The old interface for create_hypertable is also available.
Before you call create_hypertable, you create a standard Postgres relational table. For example:
CREATE TABLE conditions (time TIMESTAMPTZ NOT NULL,location text NOT NULL,temperature DOUBLE PRECISION NULL);
The following examples show you how to create a hypertable from an existing table or a function:
- Time partition a hypertable by time range
- Time partition a hypertable using composite columns and immutable functions
- Time partition a hypertable using ISO formatting
- Time partition a hypertable using UUIDv7
The following examples show different ways to create a hypertable:
Convert with range partitioning on the
timecolumn:SELECT create_hypertable('conditions', by_range('time'));Convert with a set_chunk_time_interval of 24 hours: Either:
SELECT create_hypertable('conditions', by_range('time', 86400000000));or:
SELECT create_hypertable('conditions', by_range('time', INTERVAL '1 day'));with range partitioning on the
timecolumn, do not raise a warning ifconditionsis already a hypertable:SELECT create_hypertable('conditions', by_range('time'), if_not_exists => TRUE);
Note
If you call SELECT * FROM create_hypertable(...) the return value is formatted as a table with column headings.
The following example shows how to time partition the measurements relational table on a composite
column type using a range partitioning function.
Create the report type, then an immutable function that converts the column value into a supported column value:
CREATE TYPE report AS (reported timestamp with time zone, contents jsonb);CREATE FUNCTION report_reported(report)RETURNS timestamptzLANGUAGE SQLIMMUTABLE AS'SELECT $1.reported';Create the hypertable using the immutable function:
SELECT create_hypertable('measurements', by_range('report', partition_func => 'report_reported'));
The following example shows how to time partition the events table on a jsonb (event) column
type, which has a top level started key that contains an ISO 8601 formatted timestamp:
CREATE FUNCTION event_started(jsonb)RETURNS timestamptzLANGUAGE SQLIMMUTABLE AS$func$SELECT ($1->>'started')::timestamptz$func$;SELECT create_hypertable('events', by_range('event', partition_func => 'event_started'));
Create a table with a UUIDv7 column:
Partition the table based on the timestamps embedded within the UUID values:
SELECT create_hypertable('events',by_range('id', INTERVAL '1 month'));
Subsequent data insertion and queries automatically leverage the UUIDv7-based partitioning.
| Name | Type | Default | Required | Description |
|---|---|---|---|---|
create_default_indexes | BOOLEAN | TRUE | ✖ | Create default indexes on time/partitioning columns. |
dimension | DIMENSION_INFO | - | ✔ | To create a _timescaledb_internal.dimension_info instance to partition a hypertable, you call by_range and by_hash. Note: best practice is to not use additional dimensions, especially on Tiger Cloud. |
if_not_exists | BOOLEAN | FALSE | ✖ | Set to TRUE to print a warning if relation is already a hypertable. By default, an exception is raised. |
migrate_data | BOOLEAN | FALSE | ✖ | Set to TRUE to migrate any existing data in relation in to chunks in the new hypertable. Depending on the amount of data to be migrated, setting migrate_data can lock the table for a significant amount of time. If there are foreign key constraints to other tables in the data to be migrated, create_hypertable() can run into deadlock. A hypertable can only contain foreign keys to another hypertable. UNIQUE and PRIMARY constraints must include the partitioning key. Deadlock may happen when concurrent transactions simultaneously try to insert data into tables that are referenced in the foreign key constraints, and into the converting table itself. To avoid deadlock, manually obtain a SHARE ROW EXCLUSIVE create_hypertable in the same transaction. If you leave migrate_data set to the default, non-empty tables generate an error when you call create_hypertable. |
relation | REGCLASS | - | ✔ | Identifier of the table to convert to a hypertable. |
| Column | Type | Description |
|---|---|---|
hypertable_id | INTEGER | The ID of the hypertable you created. |
created | BOOLEAN | TRUE when the hypertable is created. FALSE when if_not_exists is true and no hypertable was created. |
Keywords
Found an issue on this page?Report an issue or Edit this page
in GitHub.