PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como criar uma hipertabela TimescaleDB com particionamento de tempo em carimbo de data/hora não exclusivo?


Não há necessidade de criar uma restrição única na dimensão do tempo. Isso funciona:
CREATE TABLE event (
  id serial,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');

Observe que a chave primária em id é removido.

TimescaleDB requer que qualquer restrição exclusiva ou chave primária inclua a dimensão de tempo. Isso é semelhante à limitação do PostgreSQL no particionamento declarativo para incluir a chave de partição na restrição exclusiva:

O TimescaleDB também impõe exclusividade em cada bloco individualmente. Manter a exclusividade entre os fragmentos pode afetar drasticamente o desempenho de ingestão.

A abordagem mais comum para corrigir o problema com a chave primária é criar uma chave composta e incluir a dimensão de tempo conforme proposto na pergunta. Se o índice na dimensão de tempo não for necessário (nenhuma consulta somente no tempo é esperada), então o índice na dimensão de tempo pode ser evitado:
CREATE TABLE event_hyper (
  id serial,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL,
  PRIMARY KEY (id, ts)
);

SELECT create_hypertable('event_hyper', 'ts', create_default_indexes => FALSE);

Também é possível usar uma coluna inteira como a dimensão de tempo. É importante que essa coluna tenha propriedades de dimensão de tempo:o valor está aumentando ao longo do tempo, o que é importante para o desempenho da inserção, e as consultas selecionarão um intervalo de tempo, que é crítico para o desempenho da consulta em um banco de dados grande. O caso comum é para armazenar unix epoch.

Desde id em event_hyper é SERIAL, aumentará com o tempo. No entanto, duvido que as consultas selecionem o intervalo nele. Para completar o SQL será:
CREATE TABLE event_hyper (
  id serial PRIMARY KEY,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL
);

SELECT create_hypertable('event_hyper', 'id', chunk_time_interval => 1000000);