2014-11-19 3 views
3

기본 키 "current_timestamp"를 사용하여 기본 키로 타임 스탬프 유형을 설정해야합니다. 각 경우 고유해야하며 일부 명령어는 k 레코드를 시간에 삽입 할 수 있습니다. 이것은 일종의 로그 파일입니다. 이렇게하려면 타임 스탬프 해상도를 마이크로 초로 향상시켜야합니다. (초당 100 만 건의 레코드를 작성할 수 있다고는 생각하지 않습니다.) 이러한 종류의 정밀도는 포스트그레스에 대해 가능합니다. See here 다음과 같습니다.타임 스탬프 해상도

CREATE TABLE upsistema 
(
    t timestamp(6) without time zone NOT NULL DEFAULT current_timestamp(6) without time zone, 
    blabla bigint, 
    foo bigint, 
    CONSTRAINT "XIDS3w" PRIMARY KEY (t) 
) 

하지만 작동하지 않습니다. pgAdmin3을 사용하여 검사 할 때 밀리 초 정밀도로 항상 기록됩니다. 물론 밀리 초 단위로 더 많은 레코드를 작성할 수 있습니다. 그래서 마이크로 초 정밀도로 저장하려면 일부 미스터리 변수 또는 다른 것을 설정해야합니까?

+0

흠, 테스트 해봤는데 나에게 잘 돌아 간다. http://sqlfiddle.com/#!15/619a0/1 – krokodilko

+0

_pg가 수백만 개의 레코드를 쓸 수 있다고 생각하지 않는다. 너는 농담이야.값이 싼 Intel i5 CPU를 사용하는 우분투 데스크탑 상자는 1 초당 1 백만 행을 임시 테이블에 0.4 초 이내에 가져옵니다. –

+0

정말입니까? 20 바이트 (3 개의 필드로 충분)로 레코드를 작성하면 하드 디스크의 초당 20MB를 작성해야합니다. 그래서 IDK. 간단한 루프를 시도 : 함수를 만들거나 바꾸기 test() 반환 값 $ BODY $ DECLARE t timestamp; declare i bigint; BEGIN FOR i IN 1..1000000 LOOP 삽입 tst 값 (i); - 루프 내에서 1,2,3,4,5,6,7,8,9,10 값을 사용합니다. END LOOP; 끝; $ BODY $ LANGUAGE plpgsql VOLATILE 비용 100; 그것은 27 초를 필요로한다. 테이블 tst는 필드가 있습니다. 나는 한계가 프로세서 나 OS가 아닌 하드 디스크라고 생각한다. Soooo ... IDK – jurhas

답변

1

here 문서에서 보셨 듯이 해상도는 timestamp 유형을 사용하는 microseconds까지 가능합니다.

CREATE TABLE table_test 
(
    column1 timestamp(6) without time zone, 
    column2 timestamp(6) without time zone 
); 

insert into table_test (column1,column2) values (current_timestamp, current_timestamp + interval '100 MICROSECONDS'); 

select extract (MICROSECONDS from column1 - column2) from table_test; 

결과 :

date_part 
----------- 
     -100 
(1 ligne) 
1

기본적으로 PostgreSQL의 저장 가능한 최대 정밀도로 타임 스탬프 여기

은 마이크로가 있음을 보여 예입니다.

내가 신발을 신고했다면 타임 스탬프에 다른 기본값을 사용할 수 있습니다. current_timestamp 값은 현재 트랜잭션이 시작된 시간입니다. 얼마나 많은 행을 삽입하든 아무리 오래 걸리더라도 트랜잭션 실행 중에는 변경되지 않습니다. 이는 중복 된 기본 키 값으로 인해 INSERT 문이 실패 할 수 있음을 의미합니다. 대신 기본값으로

create table upsistema (
    t timestamp without time zone primary key 
    default current_timestamp, 
    foo bigint 
); 
insert into upsistema (foo) values (42), (43), (44); 
 
ERROR: duplicate key value violates unique constraint "upsistema_pkey" 

해보십시오 clock_timestamp(). 이는 성공을 보장하지는 않지만 성공 가능성을 높입니다.

 
t        foo 
-- 
2014-11-19 19:17:23.369432  42 
2014-11-19 19:17:23.36958  43 
2014-11-19 19:17:23.369587  44 

create table upsistema (
    t timestamp without time zone primary key 
    default clock_timestamp(), 
    foo bigint 
); 
insert into upsistema (foo) values (42), (43), (44); 

select * from upsistema; 
절대적으로 성공을 보장 중 하나를 기본 키 제약 조건을 변경하거나 완전히 드롭합니다. 이것이 의미가 있는지 여부는 응용 프로그램에 따라 다르지만, 이 아닐 경우은 동일한 마이크로 초에 데이터를 기록하는 여러 클라이언트를 발견하게되어 놀랄 것입니다.

테이블에 timestamp without time zone을 사용하지만 current_timestamp 및 clock_timestamp()는 timestamp with time zone을 반환합니다. SQL 문을 실행하기 전에 세션의 표준 시간대를 UTC로 변경하는 것이 좋습니다.

set time zone 'UTC'; 
select ... ; 

set time zone 'UTC'; 
insert ... ; 

서버는 기본적으로 UTC를 사용하도록 설정하는 의미가있는 경우

, 당신은 'UTC'에 postgresql.conf의에서 시간대 매개 변수를 설정할 수 있습니다. 그런 다음 각 세션에서 시간대를 설정할 필요가 없습니다.

+1

고마워요. 오랜 연구 끝에, 나는이 게시물을 발견했다. http://www.postgresql.org/message-id/[email protected] 문제는 Windows에있다. 나는 시리얼을 구현해야만한다. – jurhas

+0

Good find. PostgreSQL은 많은 것들을 위해 기본 운영체제에 의존합니다. –