PostgreSQL 8.3 DBテーブルを最大限に最適化しようとしていますが、文字列の最初のN文字に対してvarchar_pattern_ops
実行している特定の列に使用する必要があるかどうかわかりません。このドキュメントLIKE
によると、の使用は「...サーバーが標準の「C」ロケールを使用しない場合」にのみ必要です。xxx_pattern_ops
誰かがこれが何を意味するのか説明できますか?データベースが使用しているロケールを確認するにはどうすればよいですか?
現在、一部のロケール[ 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(米国英語)の規則です。
コンピューティングでは、ロケールは、ユーザーの言語、国、およびユーザーがユーザーインターフェイスに表示したい特別なバリアント設定を定義する一連のパラメーターです。通常、ロケール識別子は、少なくとも言語識別子と地域識別子で構成されます。
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)
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);
オプションがある場合...
Cロケールでデータベースクラスターを再作成できます。
Postgresインスタンスを初期化するときに、ロケールをinitdbに渡す必要があります。
これは、サーバーのデフォルトまたはユーザーのロケールに関係なく実行できます。
ただし、これはサーバー管理コマンドであり、データベーススキーマ設計者のタスクではありません。クラスターには、最適化するデータベースだけでなく、サーバー上のすべてのデータベースが含まれます。
まったく新しいクラスターを作成し、既存のデータベースやデータを移行しません。それは追加の作業になります。
さらに、オプションとして新しいクラスターの作成を検討できる立場にある場合は、代わりにPostgreSQL8.4の使用を検討する必要があります。PostgreSQL8.4は、 CREATEDATABASEステートメントで指定されたデータベースごとのロケールを持つことができます。
別の方法もあります(変更するのではなく、チェックしたい場合):
ファイル/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