Question

Je suis en train d'optimiser mes tables DB PostgreSQL 8.3 au mieux de mes capacités, et je ne suis pas sûr si je dois utiliser varchar_pattern_ops pour certaines colonnes où je joue un LIKE contre les N premiers caractères d'une chaîne . Selon cette documentation , l'utilisation de xxx_pattern_ops est seulement nécessaire " ... lorsque le serveur ne pas utiliser les paramètres régionaux standard « C » ».

Quelqu'un peut-il expliquer ce que cela signifie? Comment puis-je vérifier ma base de données que soit la langue utilise?

Était-ce utile?

La solution

À l'heure actuelle certains paramètres régionaux [ docs ] soutien ne peut être réglé à initdb, mais je pense que celui correspondant à _pattern_ops peut être modifié par SET lors de l'exécution, LC_COLLATE. Pour voir les valeurs de réglage que vous pouvez utiliser le commande SHOW .

Par exemple:

SHOW LC_COLLATE

indices de _pattern_ops sont utiles dans les colonnes qui utilisent des produits d'assemblage qui correspond à motif, comme LIKE ou regexps. Il vous reste à faire un index régulier (sans _pattern_ops) pour faire la recherche de l'égalité sur un indice. Donc, il faut prendre tout cela en considération pour voir si vous avez besoin de ces index sur vos tables.

A propos de ce que locale est, il est un ensemble de règles concernant la commande de caractères, le formatage et les choses semblables qui varient d'une langue / pays à l'autre langue / pays. Par exemple, les paramètres régionaux fr_CA (français au Canada) pourrait avoir des règles de tri différentes (ou manière d'afficher les numéros, etc.) que en_CA (anglais au Canada.). La norme locale « C » est le lieu par défaut conforme aux normes POSIX. Seuls les strictes caractères ASCII sont valides et les règles de la commande et la mise en forme sont principalement ceux de en_US (anglais américain)

  

En informatique, locale est un ensemble de   paramètres qui définissent de l'utilisateur   la langue, le pays et tout dommage spécial   préférences variantes que l'utilisateur   veut voir dans leur interface utilisateur.   Habituellement, un identificateur de localisation est constitué   d'au moins un identificateur de langue et   un identificateur de région.

Autres conseils

psql -l

selon manuel

exemple de sortie:

                               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)

Il y a aussi une autre façon (en supposant que vous voulez les vérifier, ne pas les modifier):

fichier Check /var/lib/postgres/data/postgresql.conf Les lignes suivantes doivent être trouvées:

# 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

OK, de mes perusings, il semble que ce réglage initial

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.

spécifie essentiellement les paramètres régionaux « par défaut » pour toute base de données que vous créez après (à-dire qu'elle spécifie les paramètres de template1, qui est le modèle par défaut). Vous pouvez créer de nouvelles bases de données avec des paramètres régionaux différents comme ceci:

est différent Locale encodage, vous pouvez manuellement spécifier et / ou encodage:

 CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

Si vous voulez appeler manuellement sur.

En gros, si vous ne spécifiez pas, il utilise le système par défaut, ce qui est presque jamais « C ».

Donc, si votre show LC_COLLATE retourne autre chose que « C » ou « POSIX », alors vous n'utilisez pas le standard C locale et vous devrez spécifier les xxx_pattern_ops pour vos index. A noter également la que si vous souhaitez utiliser le <, <=,>, ou> = vous devez créer un second index sans le drapeau xxx_pattern_ops (sauf si vous utilisez les paramètres régionaux C standard sur votre base de données, ce qui est rare ...). Pour seulement == et LIKE (etc.) vous n'avez pas besoin d'un deuxième indice. Si vous n'avez pas besoin LIKE vous n'avez pas besoin de l'index avec xxx_pattern_ops, peut-être, aussi bien.

Même si vos index sont définis pour collationner avec le « default » comme

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default");

Cela ne suffit pas, à moins que la valeur par défaut est la collation « C » (ou Posix, la même chose), il ne peut pas être utilisé pour des modèles comme LIKE 'ABC%'. Vous avez besoin de quelque chose comme ceci:

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default" varchar_pattern_ops);

Si vous avez l'option ...

Vous pouvez recréer le cluster de bases de données avec les paramètres régionaux C.

Vous devez passer les paramètres régionaux initdb lorsque votre instance Initializing Postgres.

Vous pouvez le faire quel que soit le défaut ou les paramètres régionaux de l'utilisateur du serveur est.

C'est une commande d'administration du serveur cependant, pas les concepteurs de schéma base de données tâche. Le cluster contient toutes les bases de données sur le serveur, et pas seulement celui que vous optimisez.

Il crée une toute nouvelle grappe, et ne migre pas de vos bases de données ou les données existantes. Ce serait un travail supplémentaire.

En outre, si vous êtes dans une position où vous pouvez envisager de créer un nouveau cluster en option, vous devriez vraiment envisagez d'utiliser PostgreSQL 8.4 à la place, ce qui peut avoir locales par base de données, spécifiées dans le CREATE DATABASE .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top