Como sei se o meu servidor de PostgreSQL está a usar a localização "C"?
estou a tentar optimizar as minhas tabelas de 8,3 DB PostgreSQL o melhor que posso, e não tenho a certeza se preciso de usar varchar_pattern_ops
para certas colunas onde estou a executar um LIKE
contra os primeiros n Caracteres de uma cadeia. De acordo com esta documentação, a utilização de xxx_pattern_ops
só é necessária "...quando o servidor não usa o 'C' locale ' padrão.
5 answers
De momento, algum suporte locale [{[[7]}docs ] só pode ser definido à hora do initdb, mas penso que o relevante para _pattern_ops
pode ser modificado através de SET à hora de execução, LC_COLLATE. Para ver os valores definidos, poderá usar o comando SHOW.
Por exemplo:
SHOW LC_COLLATE
_pattern_ops
os índices são úteis em colunas que usam construções de correspondência de padrões, como o LIKE
ou o 'regexps'. Você ainda tem que fazer um índice regular (Sem _pattern_ops
) para fazer a pesquisa de igualdade em um índice. Por isso, tens de o fazer. leve tudo isso em consideração para ver se você precisa desses índices em suas tabelas.
Sobre o que é locale , é um conjunto de regras sobre ordenação de caracteres, formatação e coisas semelhantes que variam de Língua/país para outra língua/País. Por exemplo, o locale fr_CA (francês no Canadá) pode ter algumas regras de ordenação diferentes (ou maneira de exibir números e assim por diante) do que en_CA (Inglês no Canadá).). A localização padrão " C " é o padrão compatível com os Padrões POSIX localidade. Apenas caracteres ASCII restritos são válidos, e as regras de ordenação e formatação são principalmente as de en_US (Inglês DOS EUA)
Em computação, locale é um conjunto de parâmetros que definem o língua, país e qualquer preferências da variante que o utilizador quer ver na sua interface de utilizador. Normalmente, um identificador local consiste de pelo menos um identificador de língua e um identificador de região.
Psql-l
De acordo com o manual
Exemplo de saída:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------------+--------+----------+-------------+-------------+-------------------
packrd | packrd | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | packrd | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | packrd | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/packrd +
| | | | | packrd=CTc/packrd
template1 | packrd | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/packrd +
| | | | | packrd=CTc/packrd
(5 rows)
Você precisa passar a localização para initdb Quando inicializar a sua instância de Postgres.
Você pode fazer isso independentemente de qual é o padrão do servidor ou localização do Usuário.
Isso é um comando de administração de servidores, Não uma tarefa de desenhadores de esquemas de bases de dados. O conjunto contém todas as bases de dados do servidor, não apenas a que você é optimizar. Cria um novo conjunto e não migra nenhuma das suas bases de dados ou dados existentes. Isso seria trabalho adicional.Além disso, se estiver numa posição em que possa considerar a criação de um novo conjunto como uma opção, deverá considerar a utilização do PostgreSQL 8.4 em vez disso, que poderá ter localizações por base de dados, especificadas no criar uma declaração de base de dados.
initdb --locale=xxx
--locale=locale
Specifies the locale to be used in this database. This is equivalent to specifying both --lc-collate and --lc-ctype.
Basicamente especifica o local" default " para toda a base de dados que você criar depois disso (ou seja, especifica as configurações para template1, que é o modelo padrão). Você pode criar novas bases de dados com um local diferente como este:
A localização é diferente da codificação, pode indicar manualmente e / ou codificação:
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
Se quiser ligar manualmente as.
Basicamente se você não especificar, ele usa o padrão do sistema, que é quase nunca "C".
Por isso, se o seu show LC_COLLATE
devolve algo que não seja "C" ou "POSIX", então não está a usar o standard C locale
e terá de especificar o xxx_ prattern_ops para os seus índices. Note também o caveat que se quiser usar os operadores , ou >= necessita de criar um segundo índice sem a bandeira xxx_pattern_ops (a menos que esteja a usar a configuração C normal na sua base de dados, o que é raro...). Para just = = e LIKE
(etc.) então você não precisa de um segundo índice. Se você não precisa LIKE
então você não precisa do índice com xxx_pattern_ops, possivelmente, também.
Mesmo que os seus índices estejam definidos para comparar com o" padrão " como
CREATE INDEX my_index_name
ON table_name
USING btree
(identifier COLLATE pg_catalog."default");
Isto não é suficiente, a menos que o padrão seja a colação "C" (ou POSIX, a mesma coisa), não pode ser usado para padrões como LIKE 'ABC%'
. Precisas de algo assim.
CREATE INDEX my_index_name
ON table_name
USING btree
(identifier COLLATE pg_catalog."default" varchar_pattern_ops);
Existe também outra maneira (assumindo que você quer verificá-los, não modificá-los):
Verifique o ficheiro / var/lib/postgres/data / postgresql.conf Devem ser encontradas as seguintes linhas:
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'en_US.UTF-8' # locale for system error message strings
lc_monetary = 'en_US.UTF-8' # locale for monetary formatting
lc_numeric = 'en_US.UTF-8' # locale for number formatting
lc_time = 'en_US.UTF-8' # locale for time formatting