2009-11-03 5 views
10

J'essaie d'optimiser mes tables DB PostgreSQL 8.3 au mieux de mes capacités, et je ne sais pas si j'ai besoin d'utiliser varchar_pattern_ops pour certaines colonnes où j'effectue un LIKE par rapport aux N premiers caractères d'une chaîne. Selon this documentation, l'utilisation de xxx_pattern_ops est seulement nécessaire "... lorsque le serveur n'utilise pas la locale" C "standard".Comment savoir si mon serveur PostgreSQL utilise les paramètres régionaux "C"?

Quelqu'un peut-il expliquer ce que cela signifie? Comment puis-je vérifier les paramètres régionaux utilisés par ma base de données?

Répondre

11

Actuellement, une prise en charge des paramètres régionaux [docs] ne peut être définie qu'à l'instant initdb, mais je pense que celui correspondant à _pattern_ops peut être modifié via SET lors de l'exécution, LC_COLLATE. Pour voir les valeurs définies, vous pouvez utiliser la commande SHOW.

Par exemple:

SHOW LC_COLLATE 

_pattern_ops index sont utiles dans les colonnes qui utilisent des produits d'assemblage d'appariement de formes, comme LIKE ou regexps. Vous devez toujours faire un index régulier (sans _pattern_ops) pour faire une recherche d'égalité sur un index. Donc, vous devez prendre tout cela en considération pour voir si vous avez besoin de ces index sur vos tables. A propos de locale, c'est un ensemble de règles sur la classification des personnages, le formatage et les choses similaires qui varient d'une langue/pays à une autre langue/pays. Par exemple, la locale fr_CA (français au Canada) pourrait avoir des règles de tri différentes (ou une façon d'afficher des nombres et ainsi de suite) que en_CA (anglais au Canada). Les paramètres régionaux "C" standard sont les paramètres régionaux par défaut conformes POSIX. Seuls les caractères ASCII stricts 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éfinit la langue de l'utilisateur, le pays et tout dommage spécial variantes de préférences que l'utilisateur veut voir dans leur interface utilisateur. Généralement, un identificateur de paramètres régionaux comprend d'au moins un identificateur de langue et un identificateur de région.

+0

Donc, si je comprends bien la documentation SHOW correctement, la valeur LC_COLLATE de mon serveur de « en_US.UTF-8 » signifie qu'il est de ne pas utiliser les paramètres régionaux « C », auquel cas Je dois m'assurer d'utiliser xxx_pattern_ops. Est-ce correct? –

+0

Vous devez créer ces index uniquement si les critères s'appliquent (correspondance de modèle sur les colonnes). Voir mes modifications. –

+0

LC_COLLATE: [Actuellement, ce paramètre peut être affiché mais pas défini, car le paramètre est déterminé lors de la création de la base de données.] (Http://www.postgresql.org/docs/9.2/static/sql-show.html) –

1

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 transmettre les paramètres régionaux à initdb lorsque initializing votre instance Postgres.

Vous pouvez le faire indépendamment des paramètres régionaux par défaut du serveur ou de l'utilisateur.

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

Il crée un tout nouveau cluster et ne migre aucune de vos bases de données ou données existantes. Ce serait un travail supplémentaire.

En outre, si vous êtes en mesure d'envisager de créer un nouveau cluster en option, vous devriez envisager d'utiliser plutôt PostgreSQL 8.4, qui peut avoir per-database locales, spécifié dans le CREATE DATABASE statement.

7

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) 
0

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

Vérifiez le fichier /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 
0

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 (à savoir il 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 un autre lieu comme celui-ci:

Locale est différent de l'encodage, vous pouvez manuellement specify et/ou le codage:

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

Si vous voulez appeler manuellement sortir. Fondamentalement, si vous ne le spécifiez pas, il utilise la valeur par défaut du système, qui n'est presque jamais "C".

Donc, si votre show LC_COLLATE renvoie autre chose que "C" ou "POSIX" alors vous n'utilisez pas le standard C locale et vous devrez spécifier le xxx_pattern_ops pour vos index. Notez également le caveat que si vous souhaitez utiliser les opérateurs <, < =,>, ou> =, vous devez créer un second index sans l'indicateur 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.) alors vous n'avez pas besoin d'un second index. Si vous n'avez pas besoin de LIKE alors vous n'avez pas besoin de l'index avec xxx_pattern_ops, peut-être aussi.

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 peut » t être utilisé pour des motifs 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); 
Questions connexes