고유하지 않은 타임 스탬프에서 시간 분할로 TimescaleDB Hypertable을 만드는 방법은 무엇입니까?

jbx

TimescaleDB를 사용하기 시작했으며 이벤트가있는 테이블에 하이퍼 테이블을 만들고 싶습니다. 원래 나는 다음과 같은 전통적인 패턴을 따르는 것을 생각했습니다.

CREATE TABLE event (
  id serial PRIMARY KEY,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL
);

CREATE INDEX event_ts_idx on event(ts);

그러나 다음 쿼리로 하이퍼 테이블을 만들려고 할 때 :

SELECT create_hypertable('event', 'ts');

나는 얻었다 : ERROR: cannot create a unique index without the column "ts" (used in partitioning)

조사를 한 후 타임 스탬프 자체가 기본 키 (또는 일부) 여야하는 것 같습니다.

그러나 타임 스탬프 ts가 고유 하지 않기를 바랍니다 . 이러한 고주파 이벤트는 동일한 마이크로 초 ( timestamp유형 의 최대 해상도)에 일치 할 가능성이 매우 높습니다 . 이것이 제가 처음에 TimescaleDB를 조사하는 이유입니다.

이 경우 모범 사례는 무엇입니까?

나는 아마도를 serial id기본 키의 일부로 유지하고 다음 과 같이 합성 할 수 있다고 생각했습니다.

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');

이런 종류의 작업이지만 올바른 접근 방식인지 또는 삽입 속도를 늦추거나 다른 문제를 일으키는 복잡한 기본 키를 만들고 있는지 확실하지 않습니다.

TimescaleDB 하이퍼 테이블을 사용할 때 타임 스탬프에서 충돌이 발생할 수있는 경우 올바른 접근 방식은 무엇입니까?

k_rus

고유하지 않은 타임 스탬프에서 시간 분할로 TimescaleDB Hypertable을 만드는 방법은 무엇입니까?

시간 차원에 대한 고유 한 제약 조건을 만들 필요가 없습니다. 이것은 작동합니다 :

CREATE TABLE event (
  id serial,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');

의 기본 키 id가 제거됩니다.

TimescaleDB에서는 고유 한 제약 조건 또는 기본 키에 시간 차원이 포함되어야합니다. 이는 선언적 파티셔닝 에서 고유 제약 조건에 파티션 키를 포함 하는 PostgreSQL의 제한과 유사합니다 .

파티션을 나눈 테이블의 고유 한 제약 조건 (및 기본 키)에는 모든 파티션 키 열이 포함되어야합니다. 이 제한은 PostgreSQL이 각 파티션에서 개별적으로 만 고유성을 적용 할 수 있기 때문에 존재합니다.

TimescaleDB는 또한 각 청크에서 개별적으로 고유성을 적용합니다. 청크에서 고유성을 유지하면 수집 성능에 큰 영향을 미칠 수 있습니다.

기본 키 문제를 해결하는 가장 일반적인 방법 은 복합 키를 만들고 질문에서 제안한대로 시간 차원을 포함하는 것입니다. 시간 차원의 인덱스가 필요하지 않은 경우 (시간에만 쿼리가 필요하지 않음) 시간 차원의 인덱스는 피할 수 있습니다.

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);

시간 차원으로 정수 열을 사용할 수도 있습니다. 이러한 열에는 시간 차원 속성이 있어야합니다. 시간이 지남에 따라 값이 증가하고 이는 삽입 성능에 중요하며 쿼리는 큰 데이터베이스에 대한 쿼리 성능에 중요한 시간 범위를 선택합니다. 일반적인 경우는 유닉스 시대를 저장하는 것입니다.

idin event_hyper은 SERIAL 이므로 시간이 지남에 따라 증가합니다. 그러나 쿼리가 범위를 선택하지 않을 것입니다. 완전성을 위해 SQL은 다음과 같습니다.

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);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관