我正在尝试尽我所能地优化我的PostgreSQL 8.3数据库表,而且我不确定是否需要对我正在执行varchar_pattern_ops
的某些列使用LIKE
对着字符串的前N个字符。根据{{3}},只需要使用xxx_pattern_ops
“......当服务器不使用标准的'C'语言环境时”。
有人可以解释这意味着什么吗?如何查看我的数据库使用的语言环境?
答案 0 :(得分:16)
目前,某些语言环境[docs]支持只能在initdb时设置,但我认为与_pattern_ops
相关的支持可以在运行时通过SET修改,LC_COLLATE。要查看设置值,可以使用SHOW命令。
例如:
SHOW LC_COLLATE
_pattern_ops
索引在使用模式匹配结构的列中很有用,例如LIKE
或regexps。您仍然需要创建一个常规索引(没有_pattern_ops
)来对索引执行相等搜索。因此,您必须考虑所有这些因素,看看您的表格中是否需要这样的索引。
关于locale是什么,它是关于字符排序,格式化和类似事物的一系列规则,从语言/国家到另一种语言/国家不等。例如,语言环境fr_CA(加拿大法语)可能有比en_CA(加拿大英语)更多的排序规则(或显示数字等的方式)。标准“C”语言环境是符合POSIX标准的默认语言环境。只有严格的ASCII字符才有效,排序和格式化规则主要是en_US(美国英语)
在计算中,locale是一组 定义用户的参数 语言,国家和任何特殊的 用户的变体首选项 想在他们的用户界面中看到。 通常是区域设置标识符 至少一个语言标识符和 区域标识符。
答案 1 :(得分:11)
psql -l </ p>
根据手册
示例输出:
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)
答案 2 :(得分: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
答案 3 :(得分:1)
如果你有选择......
您可以使用C语言环境重新创建数据库集群。
当你的Postgres实例initdb时,你需要将语言环境传递给initializing。
无论服务器的默认设置或用户的语言环境是什么,都可以执行此操作。
这是服务器管理命令,而不是数据库架构设计器任务。群集包含服务器上的所有数据库,而不仅仅是您正在优化的数据库。
它会创建一个全新的群集,并且不会迁移任何现有的数据库或数据。那将是额外的工作。
此外,如果您处于可以考虑创建新群集作为选项的位置,那么您应该考虑使用PostgreSQL 8.4,而per-database locales可以在CREATE DATABASE statement中指定}。
答案 4 :(得分:1)
好的,从我的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”。
因此,如果您的show LC_COLLATE
返回“C”或“POSIX”以外的任何内容,那么您没有使用standard C locale
,您需要为索引指定xxx_pattern_ops。另请注意caveat如果您要使用&lt;,&lt; =,&gt;或&gt; =运算符,则需要创建不带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,同样的东西)整理,否则它不能用于像LIKE 'ABC%'
这样的模式。你需要这样的东西:
CREATE INDEX my_index_name
ON table_name
USING btree
(identifier COLLATE pg_catalog."default" varchar_pattern_ops);