我想尽我所能优化我的PostgreSQL 8.3数据库表,并且我不确定是否需要对某些列使用varchar_pattern_ops
,因为我对字符串的前N个字符执行LIKE
。根据this documentation,仅当需要使用xxx_pattern_ops
时......“当服务器不使用标准'C'语言环境”时。我如何知道我的PostgreSQL服务器是否使用“C”语言环境?
有人可以解释这是什么意思?如何检查我的数据库正在使用的区域设置?
我想尽我所能优化我的PostgreSQL 8.3数据库表,并且我不确定是否需要对某些列使用varchar_pattern_ops
,因为我对字符串的前N个字符执行LIKE
。根据this documentation,仅当需要使用xxx_pattern_ops
时......“当服务器不使用标准'C'语言环境”时。我如何知道我的PostgreSQL服务器是否使用“C”语言环境?
有人可以解释这是什么意思?如何检查我的数据库正在使用的区域设置?
目前有些语言环境[docs]支持只能在initdb时设置,但我认为可以在运行时通过SET修改与相关的那个LC_COLLATE。要查看设置值,您可以使用SHOW命令。
例如:
SHOW LC_COLLATE
索引是在该使用模式匹配构建体,像LIKE
或正则表达式的列是有用的。您仍然必须定期进行索引(没有)才能在索引上进行等式搜索。所以你必须考虑所有这些,看看你的桌子上是否需要这样的索引。
关于locale是什么,它是一套有关字符排序,格式和类似的东西,从语言/国家到另一种语言/国家不同的规则。例如,fr_CA(加拿大法语)的区域设置可能与en_CA(加拿大英语)有一些不同的排序规则(或显示数字的方式等)。标准的“C”语言环境是符合POSIX标准的默认语言环境。只有严格的ASCII字符是有效的,并且排序和格式规则的大多是那些EN_US(美国英语)
在计算,现场是一组 参数定义用户的 语言,国家和任何特殊 用户 想要在其用户界面中看到的变体首选项。 通常,区域标识符由至少一个语言标识符和 区域标识符组成 。
如果你有选择...
你可以重新使用C语言环境数据库集群。
当您的Postgres实例为initializing时,您需要将区域设置传递给initdb。
无论服务器的默认设置或用户的语言环境如何,您都可以这样做。
虽然这是一个服务器管理命令,但不是数据库模式设计器任务。群集包含服务器上的所有数据库,而不仅仅是您正在优化的数据库。
它创建了一个全新的群集,并且不会迁移任何现有的数据库或数据。这将是额外的工作。此外,如果您处于可以考虑创建新群集作为选项的位置,那么您应该考虑使用PostgreSQL 8.4,而不是CREATE DATABASE statement中指定的per-database locales。
的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)
也有另一种方法(假设你要检查他们,而不是对其进行修改):
检查文件/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
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);
所以,如果我理解正确的SHOW文档,则“是en_US.UTF-8”我的服务器的LC_COLLATE价值意味着它不使用“C”语言环境,在这种情况下,我需要确保使用xxx_pattern_ops。是对的吗? – 2009-11-03 07:37:19
仅当条件适用(模式匹配列)时,才需要创建此类索引。查看我的编辑。 – 2009-11-03 07:47:25
LC_COLLATE:[目前,此参数可以显示但未设置,因为该设置是在数据库创建时确定的。](http://www.postgresql.org/docs/9.2/static/sql-show.html) – 2014-03-08 19:08:22