2009-11-03 77 views
10

我想尽我所能优化我的PostgreSQL 8.3数据库表,并且我不确定是否需要对某些列使用varchar_pattern_ops,因为我对字符串的前N个字符执行LIKE。根据this documentation,仅当需要使用xxx_pattern_ops时......“当服务器不使用标准'C'语言环境”时。我如何知道我的PostgreSQL服务器是否使用“C”语言环境?

有人可以解释这是什么意思?如何检查我的数据库正在使用的区域设置?

回答

11

目前有些语言环境[docs]支持只能在initdb时设置,但我认为可以在运行时通过SET修改与​​相关的那个LC_COLLATE。要查看设置值,您可以使用SHOW命令。

例如:

SHOW LC_COLLATE 

​​索引是在该使用模式匹配构建体,像LIKE或正则表达式的列是有用的。您仍然必须定期进行索引(没有​​)才能在索引上进行等式搜索。所以你必须考虑所有这些,看看你的桌子上是否需要这样的索引。

关于locale是什么,它是一套有关字符排序,格式和类似的东西,从语言/国家到另一种语言/国家不同的规则。例如,fr_CA(加拿大法语)的区域设置可能与en_CA(加拿大英语)有一些不同的排序规则(或显示数字的方式等)。标准的“C”语言环境是符合POSIX标准的默认语言环境。只有严格的ASCII字符是有效的,并且排序和格式规则的大多是那些EN_US(美国英语)

在计算,现场是一组 参数定义用户的 语言,国家和任何特殊 用户 想要在其用户界面中看到的变体首选项。 通常,区域标识符由至少一个语言标识符和 区域标识符组成 。

+0

所以,如果我理解正确的SHOW文档,则“是en_US.UTF-8”我的服务器的LC_COLLATE价值意味着它不使用“C”语言环境,在这种情况下,我需要确保使用xxx_pattern_ops。是对的吗? – 2009-11-03 07:37:19

+0

仅当条件适用(模式匹配列)时,才需要创建此类索引。查看我的编辑。 – 2009-11-03 07:47:25

+0

LC_COLLATE:[目前,此参数可以显示但未设置,因为该设置是在数据库创建时确定的。](http://www.postgresql.org/docs/9.2/static/sql-show.html) – 2014-03-08 19:08:22

1

如果你有选择...

你可以重新使用C语言环境数据库集群。

当您的Postgres实例为initializing时,您需要将区域设置传递给initdb

无论服务器的默认设置或用户的语言环境如何,您都可以这样做。

虽然这是一个服务器管理命令,但不是数据库模式设计器任务。群集包含服务器上的所有数据库,而不仅仅是您正在优化的数据库。

它创建了一个全新的群集,并且不会迁移任何现有的数据库或数据。这将是额外的工作。此外,如果您处于可以考虑创建新群集作为选项的位置,那么您应该考虑使用PostgreSQL 8.4,而不是CREATE DATABASE statement中指定的per-database locales

7

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

OK,从我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. 

基本上指定了之后你创建的所有数据库中的“默认”区域(即它指定了template1的默认模板设置)。你可以用不同的区域设置这样创建新的数据库:

区域设置比编码不同,您可以手动specify它和/或编码:

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

如果你想手动调用它。

基本上如果你没有指定它,它使用系统默认值,它几乎从不“C”。

所以,如果不是“C”或“POSIX”,那么你不使用standard C locale,你将需要为索引指定xxx_pattern_ops等你show LC_COLLATE回报什么。另请注意,如果要使用<,< =,>或> =运算符,则需要创建第二个索引而不使用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); 
相关问题