2009-11-03 5 views
10

Я пытаюсь оптимизировать свои таблицы DB PostgreSQL 8.3, и я не уверен, что мне нужно использовать varchar_pattern_ops для определенных столбцов, где я выполняю LIKE против первых N символов строки. Согласно this documentation, использование xxx_pattern_ops необходимо только «... когда сервер не использует стандартную« C »локаль».Как узнать, использует ли мой сервер PostgreSQL язык «C»?

Может кто-нибудь объяснить, что это значит? Как проверить, какой язык использует моя база данных?

ответ

11

В настоящее время некоторые локали [docs] поддержка может быть установлена ​​только в initdb время, но я думаю, что один отношение к _pattern_ops может быть изменен с помощью SET во время выполнения, LC_COLLATE. Чтобы увидеть установленные значения, вы можете использовать команду SHOW.

Например:

SHOW LC_COLLATE 

_pattern_ops индексы полезны в столбцах, которые используют сопоставление с образцом конструкции, как LIKE или регулярных выражений. Вам нужно сделать регулярный индекс (без _pattern_ops), чтобы выполнить поиск равенства по индексу. Поэтому вам нужно принять все это во внимание, чтобы увидеть, нужны ли вам такие индексы на ваших таблицах.

О том, что такое locale, это набор правил по упорядочению символов, форматированию и тому подобным вещам, которые варьируются от языка/страны до другого языка/страны. Например, локаль fr_CA (французский в Канаде) может иметь несколько разных правил сортировки (или способ отображения чисел и т. Д.), Чем en_CA (английский в Канаде). Стандартный языковой стандарт «C» является стандартным стандартом стандарта POSIX. Только строгие символы ASCII являются действительными, и правила упорядочения и форматирования в основном те из en_US (US English)

В вычислениях, локалите набор параметров, который определяет языка пользователя, страну и любые специальный Варианты предпочтений, которые пользователь хочет видеть в своем пользовательском интерфейсе. Обычно идентификатор локали состоит из , по меньшей мере, идентификатора языка и идентификатор региона.

+0

Так что, если я понимание документации SHOW правильно, то LC_COLLATE значение моего сервера из «en_US.UTF-8» означает, что он не использует «C» локали, в этом случае Мне нужно убедиться, что вы используете xxx_pattern_ops. Это правильно? –

+0

Вам необходимо создать такие индексы только в том случае, если применяются критерии (сопоставление образцов по столбцам). Смотрите мои правки. –

+0

LC_COLLATE: [В настоящее время этот параметр может быть показан, но не установлен, поскольку параметр определяется во время создания базы данных.] (Http://www.postgresql.org/docs/9.2/static/sql-show.html) – 2014-03-08 19:08:22

1

Если у вас есть возможность ...

Вы можете воссоздать кластер базы данных с локалью C.

Вам необходимо передать местонахождение в initdb, когда initializing ваш экземпляр Postgres.

Вы можете сделать это независимо от того, что указано по умолчанию или по умолчанию для пользователя.

Это команда администрирования сервера, хотя задача дизайнеров схемы базы данных. Кластер содержит все базы данных на сервере, а не только те, которые вы оптимизируете.

Создает новый кластер и не переносит ни одну из существующих баз данных или данных. Это будет дополнительная работа.

Кроме того, если вы можете рассмотреть возможность создания нового кластера в качестве опции, вам действительно стоит рассмотреть возможность использования PostgreSQL 8.4, который может иметь per-database locales, указанный в CREATE DATABASE statement.

7

PSQL -l

согласно Handbook

Пример вывода:

       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

Существует также другой способ (если вы хотите, чтобы проверить их, а не изменять их):

Проверьте файл /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 
0

ОК, из моих perusings, оказывается, что установка этого начального

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. 

в основном определяет «по умолчанию» локали для всех баз данных, которые вы создаете после этого (т.е. он задает параметры для шаблона1, который является шаблоном по умолчанию). Вы можете создавать новые базы данных с другим языком, как это:

Locale отличается от кодирования, вы можете вручную specify его и/или кодирование:

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 (если вы не используете стандартную локаль C в своей базе данных, что редко. ..). Для просто == и LIKE (и т. Д.) Вам не нужен второй индекс. Если вам не нужен LIKE, вам не нужен индекс с xxx_pattern_ops, возможно, также.

Даже если ваши показатели определяются для сопоставления с «по умолчанию», как

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

Это не достаточно, если значение по умолчанию является «C» (или POSIX, то же самым) сверкой, она может» t для таких моделей, как LIKE 'ABC%'. Вам нужно что-то вроде этого:

CREATE INDEX my_index_name 
    ON table_name 
    USING btree 
    (identifier COLLATE pg_catalog."default" varchar_pattern_ops); 
Смежные вопросы