24

PostgreSQL 8.3 DBテーブルを最大限に最適化しようとしていますが、文字列の最初のN文字に対してvarchar_pattern_ops実行している特定の列に使用する必要があるかどうかわかりません。このドキュメントLIKEによると、の使用は「...サーバーが標準の「C」ロケールを使用しない場合」にのみ必要です。xxx_pattern_ops

誰かがこれが何を意味するのか説明できますか?データベースが使用しているロケールを確認するにはどうすればよいですか?

4

5 に答える 5

24

現在、一部のロケール[ docs ]サポートはinitdb時にのみ設定できますが、関連するロケール[docs]は、実行時にSET_pattern_opsを介して変更できると思います。LC_COLLATE 。設定値を確認するには、SHOWコマンドを使用できます。

例えば:

SHOW LC_COLLATE

_pattern_opsインデックスは、正規表現などのパターンマッチング構造を使用する列で役立ちますLIKE_pattern_opsインデックスで等式検索を行うには、通常のインデックス(なし)を作成する必要があります。したがって、テーブルにそのようなインデックスが必要かどうかを確認するには、これらすべてを考慮に入れる必要があります。

ロケールとは、言語/国ごとに異なる文字の順序、書式設定、および同様のものに関する一連のルールです。たとえば、ロケールfr_CA(カナダのフランス語)には、en_CA(カナダの英語)とは異なる並べ替え規則(または数値の表示方法など)がある場合があります。標準の「C」ロケールは、POSIX標準に準拠したデフォルトのロケールです。厳密なASCII文字のみが有効であり、順序とフォーマットの規則はほとんどen_US(米国英語)の規則です。

コンピューティングでは、ロケールは、ユーザーの言語、国、およびユーザーがユーザーインターフェイスに表示したい特別なバリアント設定を定義する一連のパラメーターです。通常、ロケール識別子は、少なくとも言語識別子と地域識別子で構成されます。

于 2009-11-03T07:33:02.330 に答える
17

psql -l

ハンドブックによると

出力例:

                               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)
于 2010-05-04T23:07:40.840 に答える
6

OK、私の熟読から、この初期設定は

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.

基本的に、その後に作成するすべてのデータベースの「デフォルト」ロケールを指定します(つまり、デフォルトのテンプレートであるtemplate1の設定を指定します)。次のように、異なるロケールで新しいデータベースを作成できます。

ロケールはエンコーディングとは異なり、手動で指定したり、エンコーディングを指定したりできます。

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

手動で呼び出したい場合。

基本的に、指定しない場合は、システムのデフォルトが使用されますが、これはほとんど「C」ではありません。

したがって、show LC_COLLATE「C」または「POSIX」以外のものを返す場合は、を使用していないstandard C localeため、インデックスにxxx_pattern_opsを指定する必要があります。<、<=、>、または> =演算子を使用する場合は、xxx_pattern_opsフラグなしで2番目のインデックスを作成する必要があることにも注意してください(データベースで標準のCロケールを使用している場合を除きますが、これはまれです。 ..)。==やLIKE(など)の場合、2番目のインデックスは必要ありません。必要ない場合LIKEは、おそらくxxx_pattern_opsのインデックスも必要ありません。

インデックスが「デフォルト」のように照合するように定義されている場合でも

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

これは十分ではありません。デフォルトが「C」(またはPOSIX、同じもの)の照合でない限り、のようなパターンには使用できませんLIKE 'ABC%'。次のようなものが必要です。

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default" varchar_pattern_ops);
于 2015-07-02T20:51:40.910 に答える
2

オプションがある場合...

Cロケールでデータベースクラスターを再作成できます。

Postgresインスタンスを初期化するときに、ロケールをinitdbに渡す必要があります。

これは、サーバーのデフォルトまたはユーザーのロケールに関係なく実行できます。

ただし、これはサーバー管理コマンドであり、データベーススキーマ設計者のタスクではありません。クラスターには、最適化するデータベースだけでなく、サーバー上のすべてのデータベースが含まれます。

まったく新しいクラスターを作成し、既存のデータベースやデータを移行しません。それは追加の作業になります。

さらに、オプションとして新しいクラスターの作成を検討できる立場にある場合は、代わりにPostgreSQL8.4の使用を検討する必要があります。PostgreSQL8.4は、 CREATEDATABASEステートメントで指定されたデータベースごとのロケールを持つことができます。

于 2009-11-04T21:00:16.143 に答える
2

別の方法もあります(変更するのではなく、チェックしたい場合):

ファイル/var/lib/postgres/data/postgresql.confを確認してください。次の行が見つかります。

# 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
于 2012-12-11T19:30:54.580 に答える