2009-11-03 4 views
10

Ich versuche, meine PostgreSQL 8.3 DB-Tabellen nach besten Kräften zu optimieren, und ich bin unsicher, ob ich varchar_pattern_ops für bestimmte Spalten verwenden muss, wo ich eine LIKE gegen die ersten N Zeichen einer Zeichenfolge ausführen. Laut this documentation ist die Verwendung von xxx_pattern_ops nur notwendig "... wenn der Server nicht das Standard-C-Gebietsschema verwendet".Woher weiß ich, ob mein PostgreSQL-Server das Gebietsschema "C" verwendet?

Kann jemand erklären, was das bedeutet? Wie überprüfe ich, welches Gebietsschema meine Datenbank verwendet?

Antwort

11

Derzeit einige locale [docs] Unterstützung kann nur bei initdb Zeit eingestellt werden, aber ich denke, die eine relevante _pattern_ops über SET zur Laufzeit, LC_COLLATE modifiziert werden. Um die eingestellten Werte zu sehen, können Sie den Befehl SHOW verwenden.

Zum Beispiel:

SHOW LC_COLLATE 

_pattern_ops Indizes sind in Spalten nützlich, die Musteranpassungs Konstrukte verwenden, wie LIKE oder regexps. Sie müssen weiterhin einen regulären Index (ohne _pattern_ops) erstellen, um die Gleichheits-Suche für einen Index durchzuführen. Sie müssen also alles berücksichtigen, um zu sehen, ob Sie solche Indizes für Ihre Tabellen benötigen.

Über was locale ist, ist es eine Reihe von Regeln über Zeichenreihenfolge, Formatierung und ähnliche Dinge, die von Sprache/Land zu einer anderen Sprache/Land variieren. Zum Beispiel könnte das Gebietsschema fr_CA (Französisch in Kanada) verschiedene Sortierregeln (oder die Art der Anzeige von Zahlen usw.) haben als en_CA (Englisch in Kanada). Das Standard-Gebietsschema "C" ist das mit POSIX-Standards kompatible Standardgebietsschema. Nur strenge ASCII-Zeichen gültig sind, und die Regeln der Bestellung und Formatierung sind meist diejenigen von en_US (US-Englisch)

In Computing, locale ist ein Satz von Parameter, die die Sprache, das Land des Benutzers definiert und eine besondere Variantenpräferenzen, die der Benutzer in ihrer Benutzeroberfläche sehen möchte. Normalerweise besteht eine Gebietsschema-ID aus mindestens einer Sprachenkennung und eine Regionskennung.

+0

Also, wenn ich die Show Dokumentation richtig bin zu verstehen, dann ist mein Servers LC_COLLATE Wert von „en_US.UTF-8“ bedeutet, dass es nicht die locale „C“ ist unter Verwendung, wobei in diesem Fall Ich muss sicherstellen, dass xxx_pattern_ops verwendet wird. Ist das richtig? –

+0

Sie müssen solche Indizes nur erstellen, wenn die Kriterien zutreffen (Mustervergleich über die Spalten). Sieh dir meine Änderungen an. –

+0

LC_COLLATE: [Derzeit kann dieser Parameter angezeigt, aber nicht gesetzt werden, da die Einstellung zum Zeitpunkt der Datenbankerstellung festgelegt wird.] (Http://www.postgresql.org/docs/9.2/static/sql-show.html) –

1

Wenn Sie die Option haben ...

Sie können den Datenbank-Cluster mit den C-locale neu erstellen.

Sie müssen das Gebietsschema an initdb übergeben, wenn initializing Ihre Postgres-Instanz.

Sie können dies ungeachtet dessen tun, was der Server standardmäßig oder das Gebietsschema des Benutzers ist.

Dies ist jedoch ein Serververwaltungsbefehl, keine Datenbankschemaentwurfsaufgabe. Der Cluster enthält alle Datenbanken auf dem Server, nicht nur den, den Sie optimieren.

Es erstellt einen brandneuen Cluster und migriert keine Ihrer vorhandenen Datenbanken oder Daten. Das wäre zusätzliche Arbeit. Wenn Sie in der Lage sind, einen neuen Cluster als Option zu erstellen, sollten Sie in Betracht ziehen, stattdessen PostgreSQL 8.4 zu verwenden, das per-database locales haben kann und in CREATE DATABASE statement angegeben ist.

7

psql -l

nach

Beispiel Ausgabe Handbuch:

       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

Es gibt auch eine andere Art und Weise (vorausgesetzt, Sie sie überprüfen möchten, nicht modifizieren):

Überprüfen Sie die Datei /var/lib/postgres/data/postgresql.conf Folgende Zeilen sollten gefunden werden:

# 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, von meinem perusings, es scheint, dass diese anfängliche

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. 

im Grunde gibt die "default" locale für alle Datenbank, die Sie danach erstellen Einstellung (d Sie gibt die Einstellungen für template1 an, die Standardvorlage. Sie können wie folgt mit einem anderen Gebietsschema neue Datenbanken erstellen:

Locale als Codierung unterschiedlich ist, können Sie manuell specify es und/oder Codierung:

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

Wenn Sie es manuell rufen.

Grundsätzlich, wenn Sie es nicht angeben, verwendet es den Systemstandard, der fast nie "C" ist.

Wenn also Ihre show LC_COLLATE etwas anderes als "C" oder "POSIX" zurückgibt, dann verwenden Sie nicht die standard C locale und Sie müssen die xxx_pattern_ops für Ihre Indizes angeben. Beachten Sie auch die caveat, wenn Sie die <, < =,>, oder> = Operatoren verwenden möchten, müssen Sie einen zweiten Index ohne das Flag xxx_pattern_ops erstellen (es sei denn, Sie verwenden das Standard-C-Gebietsschema in Ihrer Datenbank, das ist selten. ..). Für nur == und LIKE (etc.) brauchen Sie dann keinen zweiten Index. Wenn Sie LIKE nicht benötigen, brauchen Sie möglicherweise auch den Index mit xxx_pattern_ops nicht.

Auch wenn Ihre Indizes definiert werden mit dem „Standard“ wie

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

Dies ist nicht genug zu sammeln, es sei denn, der Standard der „C“ (oder POSIX, die gleiche Sache) ist Sortierungs, es kann‘ t für Muster wie LIKE 'ABC%' verwendet werden. Sie brauchen etwas wie folgt aus:

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