C
조합은 최적의 선택이 될 것입니다.
로케일이 없으면 모든 것이 조금 더 빠릅니다. 데이터 정렬 잘 어쨌든 없기 때문에 그리고, 데이터베이스를 생성 하지 않고 함께 의미 정렬 C
.
많은 작업에 데이터 정렬을 제공해야하는 것은 고통 스러울 수 있습니다. 그러나 기본 데이터 정렬과 임시 데이터 정렬간에 속도에 눈에 띄는 차이가 없어야합니다. 결국 그것은 정렬되지 않은 데이터 일 뿐이며 정렬 할 때 데이터 정렬 규칙이 적용됩니다.
Postgres는 기본 OS에서 제공하는 로케일 설정을 기반으로하므로 사용할 로케일마다 로케일을 생성해야합니다. 여기 및 여기 에 대한 관련 답변이 더 있습니다 .
그러나 @Craig에서 이미 언급했듯이이 시나리오 에서는 인덱스 가 병목 현상입니다. 인덱스 데이터 정렬은 문자 데이터와 관련된 많은 경우 적용된 연산자의 데이터 정렬과 일치해야합니다.
COLLATE
인덱스 에서 지정자를 사용하여 일치하는 인덱스를 생성 할 수 있습니다 . 동일한 테이블에서 데이터를 혼합하는 경우 부분 인덱스 가 가장 적합합니다.
예를 들어 국제 문자열이있는 테이블은 다음과 같습니다.
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
그리고 한 번에 한 언어에 관심이 있습니다.
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
그런 다음 다음과 같은 부분 색인을 작성하십시오.
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
필요한 각 언어마다 하나씩.
실제로 상속 은 이와 같은 테이블에 대한 우수한 접근 방법 일 수 있습니다. 그런 다음 단일 로캘에 대한 문자열 만 포함하는 상속 된 각 테이블에 일반 인덱스를 가질 수 있습니다. 물론 상속 된 테이블에 대한 특수 규칙에 익숙해야합니다.