2017-10-01 8 views
2

각 사용자의 이름이 유니 코드 인 users 테이블이있는 postgresql 데이터베이스가 있습니다. 적어도 한 히브리어 문자가 포함 된 모든 사용자를 찾고 싶습니다. 나는 regex을 사용하여 생각했습니다.히브리어 이름을 가진 모든 레코드 찾기

select * from users 
where name ~ '[א-ת]'; 

정규식보다 효율적인 방법이 있습니까? 이름 열에 B- 트리 색인이 있습니다. 디스크 크기 대하여 @FuzzyTree

 B-tree GIST GIN 
user 0.04 0.04 0.03 
sys 0.02 0.04 0.01 
total 0.06 0.08 0.04 

의해 suggestedpg_trgm 모듈과 다른 인덱스를 사용

업데이트

는 진 인덱스 GIST 하나의 0.2 배 및 0.8 배이며 B- 나무. 그래서, 적어도 유스 케이스에 대해서는 승자가 있습니다. YMMV (예 : 색인 생성 및 업데이트를 벤치마킹하지 않은 경우) 버전 : postgres 9.6.

+1

이상 2K 담당자와, 어서보고, 당신은 우리가 원하는 이미해야하는지 당신은 당신이 몇 가지 코드 조각을 제공 할 때 더 유용한 답변을 얻을 가능성이있다. – Jan

+0

@Jan, 무엇을위한 스 니펫? 나는 무엇을 어떻게 *해야하는지보다는 * 무엇을해야하는지 묻고있다. 도움이된다면 현재 정규 표현식 코드의 스 니펫을 추가 할 수 있습니다. – dimid

답변

1

한 가지 옵션은 부울 열 즉 is_hebrew_name을 만드는 것입니다. 즉 정규식을 사용하여 한 번 업데이트하고 일반 색인을 만들 수 있습니다.

다른 열을 추가하고 싶지 않은 당신은 v9.3 이상을 실행하는 경우, 다음 name

CREATE EXTENSION pg_trgm; 
CREATE INDEX trgm_idx ON users USING GIST (name gist_trgm_ops); 

GIN 또는 GIST 인덱스를 생성 할 pg_trgm 모듈을 사용하는 것을 고려 pg_trgm 모듈은 매우 빠른 유사성 검색을 위해 텍스트 열에 대한 인덱스를 만들 수 있도록 인 GiST 및 GIN 인덱스 연산자 클래스를 제공합니다. 이러한 인덱스 유형은 위의 유사성 연산자 인 을 지원하며 LIKE, ILIKE, ~ 및 ~ * 쿼리에 대한 trigram 기반 인덱스 검색을 추가적으로 지원합니다.

색인 검색은 일반 표현에서 트라이 그램을 추출한 다음 색인에서 검색하여 작동합니다. 더 많은 트라이 그램을 정규 표현식에서 추출 할 수있는 일수록 더 효율적으로 색인을 검색 할 수 있습니다. B 트리 기반 검색과 달리 검색 문자열 은 왼쪽 고정 될 필요가 없습니다.

LIKE 및 정규식 검색의 경우 추출 가능한 트라이 그램이없는 패턴이 전체 색인 스캔으로 변질됩니다.

GiST와 GIN 인덱싱 사이의 선택은 상대방 GiST와 GIN의 성능 특성에 따라 달라지며, 이들은 다른 곳에서 논의됩니다.

은 더 많은 정보 https://www.postgresql.org/docs/9.6/static/pgtrgm.html

+0

감사합니다. [https://stackoverflow.com/questions/21830/postgresql-gin-or-gist-indexes#26398] 둘 다 결과를보고합니다. – dimid

+1

벤치 마크로 업데이트되었습니다. – dimid