텍스트 열에서 text_pattern_ops를 색인하는 이유는 무엇입니까?


18

오늘 7 주 동안 7 개의 데이터베이스가 운영자 별 인덱스를 소개했습니다.

이전 쿼리를 작성하여 패턴과 일치하는 문자열을 색인화 할 수 있습니다. text_pattern_ops값이 소문자로 색인되는 연산자 클래스 색인 .

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);

text_pattern_ops제목은 텍스트 유형이므로를 사용했습니다 . varchars, chars 또는 names를 색인화해야하는 경우 관련 ops를 사용하십시오.varchar_pattern_ops , bpchar_pattern_ops,와 name_pattern_ops.

나는 예제가 정말로 혼란 스럽다는 것을 안다. 이렇게하는 것이 왜 유용한가요?

열이 텍스트 유형 인 경우 다른 유형 (varchar, char, name)이 검색 값으로 사용되기 전에 텍스트로 캐스트되지 않습니까?

해당 인덱스는 기본 연산자를 사용하는 인덱스와 어떻게 다르게 작동합니까?

CREATE INDEX moves_title_pattern ON movies (lower(title));

1
이 관련 질문이 도움이 될 수 있습니다. dba.stackexchange.com/questions/10694/…
Erwin Brandstetter

고마워, 어윈 그 질문에 대한 당신의 대답 은이 책의 아이디어를 연구 할 때 매우 도움이되었습니다.
아이언 사무엘 맥린 장로

답변:


20

문서는 종종 그러한 질문에 대한 답변을 제공합니다. 이 경우 와 마찬가지로 :

연산자 클래스 text_pattern_ops, varchar_pattern_ops 및 bpchar_pattern_ops는 text, varchar 및 char 유형의 B- 트리 인덱스를 각각 지원합니다. 기본 연산자 클래스와의 차이점은 로케일 별 데이터 정렬 규칙이 아닌 문자별로 값이 엄격하게 비교된다는 것입니다. 이것은 데이터베이스가 표준 "C"로케일을 사용하지 않을 때 이러한 연산자 클래스를 패턴 일치 표현식 (LIKE 또는 POSIX 정규식) 과 관련된 조회에서 사용하기에 적합 하게 만듭니다 . 예를 들어 다음과 같이 varchar 열을 인덱싱 할 수 있습니다.

CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

쿼리를 원할 경우 기본 연산자 클래스를 사용하여 인덱스를 만들어야합니다. 일반 <, <=,> 또는> = 비교와 관련된 . 이러한 쿼리는 xxx_pattern_ops 연산자 클래스를 사용할 수 없습니다 . 그러나 평등 평등 비교에서는 이러한 연산자 클래스를 사용할 수 있습니다. 연산자 클래스가 다른 동일한 열에서 여러 인덱스를 만들 수 있습니다.

설명서는 다음과 같이 말합니다.

C 로캘을 사용하는 경우 기본 연산자 클래스가있는 인덱스를 C 로캘의 패턴 일치 쿼리에 사용할 수 있으므로 xxx_pattern_ops 연산자 클래스가 필요하지 않습니다.

다음과 같이 로케일을 확인할 수 있습니다 ( "C"가 아닌 UTF8 일 수 있음).

postgres=> show lc_collate;
 lc_collate
-------------
 en_GB.UTF-8

아하! 나는 그것을 읽었지만 그것을 따르기가 어렵다는 것을 알았으므로 그것을 받아들이지 않았다. 유용한 유용성이 text_pattern_ops로케일 에 달려 있다고 말 하시겠습니까 ? 로케일이 'en_US.UTF-8'( 'C'아님)이므로 패턴 쿼리가 기본 인덱스를 사용할 수 없기 때문에 나에게 도움이 될 것 같습니다.
아이언 사무엘 맥린 장로

바로 그거죠. 데이터가 기본 ASCII 문자 안에 머무르면 기본 연산자 클래스가 훌륭하다는 것을 덧붙일 것입니다 (적어도 이러한 인덱스를 사용하여 LIKE 'something %'인 쿼리가 표시됩니다).
dezso

5
@dezso : LIKE일반 b- 트리 인덱스를 사용하여 쿼리를 본 경우 db는 C로캘을 사용해야합니다 . 또는 인덱스는 COLLATE "POSIX"(또는 COLLATE "C")로 정의되고 쿼리는 일치하는 항목을 지정합니다 COLLATION. 다른 데이터 정렬을 사용하면 인덱스 순서가 로캘 규칙과 일치하지 않으므로 패턴 일치에 사용할 수 없습니다.
Erwin Brandstetter

1
@ErwinBrandstetter 확인해야합니다. 맞습니다.
dezso

1
@StopHarmingMonica 정확한 응답 (및 오류 없음)을 얻습니다. 쿼리를 사용하지 못해 쿼리 속도가 느려질 수 있습니다.
dezso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.