Postgres에서 UUID를 어떻게 색인화해야합니까?


26

나는 PostgreSQL을 처음 사용하고 일반적으로 데이터베이스를 처음 사용합니다. Postgres에서 UUID 값을 색인화하는 방법이 확립 되어 있습니까? 자동으로 사용되는 내장 기능이 없다면 해싱 사용과 trie 사용으로 나뉩니다. 내가 사용하는 것은 방대한 양의 데이터를 처리하는 것입니다.

SP-GiST 운영자 제품군 "text_ops"는 trie를 사용하여 색인합니다. UUID는 매우 길고 매우 다르기 때문에, 완전 일치 검색 만 수행하더라도 이러한 사운드는 매력적입니다.

해시 옵션도 있습니다. 해싱은 O (1)이며, 물론 평등 외에도 비교를 수행 할 필요가 없지만 UUID가 상당히 길기 때문에 해시를 생성하면 많은 시간이 낭비 될까 걱정됩니다.

아니면 이것이 시스템에 너무 의존하고 특정을 사용하는 것입니까?

나는 대부분의 경우 큰 직렬 을 사용하고 싶지만 이것을 위해 uuid 를 사용하라는 지시를 받았습니다. 서로 다른 데이터베이스를 사용하는 여러 서버가있을 수 있으므로 uuid 가 필요 하므로 고유 한 bigint를 보장 할 수 없습니다. 각 서버마다 다른 시퀀스 (및 시드)를 사용할 수 있지만 여전히 UUID만큼 유연하지는 않습니다. 예를 들어 ID와 해당 참조를 어디에서나 변환하지 않으면 한 서버에서 다른 서버로 데이터베이스 항목을 마이그레이션 할 수 없습니다.


2
"연합 데이터베이스" 는 귀하의 상황에 대한 전문 용어 라고 생각 합니다. 그렇습니다. UUID가 그 해결책입니다. 이것이 바로 중앙 집중식 조정없이 분산 시스템간에 데이터를 공유하기 위해 UUID가 수십 년 전에 발명 된 이유입니다.
Basil Bourque

몇 달 후 : 실제로 Basil Bourque가 제기 한 "페더레이션 데이터베이스"가 우리가 추구하는 것입니다. 서버가 여러 대일뿐만 아니라 오프라인 상태에서도 ID를 생성하는 클라이언트 (연방 DB의 더 많은 부분으로 생각할 수 있음)가 있습니다. 우리가 UUID를 사용하는 이유입니다.
sudo

답변:


31

PostgreSQL의 내장 uuid데이터 형식사용 하고 정기적 인 b- 트리 인덱스를 생성하십시오.

특별한 것을 할 필요가 없습니다. 이로 인해 최적의 색인이 생성되고 uuid필드는 현재 실용적으로 컴팩트 한 형태로 저장됩니다 .

(버전 10 이전의 PostgreSQL의 해시 인덱스는 크래시 안전하지 않았으며 실제로 b- 트리보다 더 나은 성능을 보인 역사적 유물이었습니다. PostgreSQL 10에서는 크래쉬 안전하고 일부는 성능 향상을 위해 고려할 수도 있습니다.)

어떤 이유로 든 uuid유형을 사용할 수없는 경우 일반적으로 텍스트 표현 또는 바람직하게 byteauuid 표현에 b- 트리를 작성합니다 .


2
hash지수와 관련한 진술은 b-tree일반적으로 유지되는 믿음이지만, 그러한 주장에 대한 출처를 인용하는 것이 도움이 될 것이라고 생각합니다.
방향 전환

1
PostgreSQL 10부터 hash인덱스는 이제 충돌로부터 안전합니다. 즉, hash인덱스는 만 사용할 수 =있으므로 다른 연산자가 필요한 경우 b-tree여전히 선호됩니다.
rintaun

1
몇 년 후, 내 경험상 Postgres 10 hash보다 훨씬 빠르지 않았습니다 b-tree. 그러나 해시 인덱스는 b- 트리보다 디스크 공간이 훨씬 적기 때문에 큰 인덱스가 a 인 경우 더 빠를 수 있습니다 내가 느끼는 문제는 없었습니다. v10에서 실제로 안전하게 사용할 수있게하겠습니다.
sudo

해시 인덱스에 좋은 쓰기 업 V10과 V11의 개선를 규칙적 있습니다 rhaas.blogspot.com/2017/09/... - amitkapila16.blogspot.com/2017/03/...
글렌 모튼

3

PostgreSQL에서 해시 인덱스가 작동하지 않습니다. PostgreSQL은 해시 인덱스가 필요하다는 것을 알고 있으며 해시 인덱스 코드는 오래되고 곰팡이가 있지만 누군가가 와서 해시 인덱싱을 기다리고 있기 때문에 제거하지 않습니다. 이 스레드를 참조하십시오 :

http://www.postgresql.org/message-id/4407.1115698257@sss.pgh.pa.us


예, 해시 인덱스를 사용하려고 할 때 경고가 표시됩니다. "매우 낙담"또는 무언가.
sudo

해시 인덱스는 일부 상황에서 PostgreSQL에서 잘 작동하지만 최근에 내장 UUID 데이터 유형 기본 및 외래 키의 해시 인덱스로 최적화하려고하면 쿼리에서 결과가 반환되지 않는 것으로 나타났습니다. 해시 인덱스는 모든 데이터 유형에 대해서만 작동하는 경우 실제로 이점이 있으며 PostgreSQL 개발자는이를 알고 있으며 자체적으로 수정하기에는 너무 게으 르며 코드를 마치기도하고 / 최종적으로기도하는 것처럼 배치합니다. 구조자.
derekm

2
그들은 Pg10가에 초점을 맞추고 된 데이터 파티션에 중요한 역할을 재생하기 때문에 누군가가 내가 추측하고있어, 해시 인덱스를 구출했습니다 wiki.postgresql.org/wiki/...을 하지만 그들은 여전히 내가 이론적으로 본 적이 당신에게 모든 것을주지 않는다 대학 데이터베이스 수업에 유용;)
sudo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.