Mat*_*ins 19 postgresql indexing varchar text locale
我正在尝试尽我所能地优化我的PostgreSQL 8.3数据库表,我不确定是否需要使用varchar_pattern_ops某些列,我正在执行LIKE一个字符串的前N个字符.根据此文档,xxx_pattern_ops只有在"...服务器不使用标准'C'语言环境时"才需要使用.
有人可以解释这意味着什么吗?如何查看我的数据库使用的语言环境?
Vin*_*vic 19
目前一些locale [ docs ]支持只能在initdb时设置,但我认为相关的一个_pattern_ops可以在运行时通过SET修改,LC_COLLATE.要查看设置值,可以使用SHOW命令.
例如:
SHOW LC_COLLATE
Run Code Online (Sandbox Code Playgroud)
_pattern_ops索引在使用模式匹配结构的列中很有用,例如LIKE或正则表达式.您仍然必须使用常规索引(不_pattern_ops)对索引执行相等搜索.所以你必须考虑所有这些,看看你的表是否需要这样的索引.
关于什么是语言环境,它是关于字符排序,格式化和类似事物的一系列规则,从语言/国家到另一种语言/国家不等.例如,语言环境fr_CA(加拿大法语)可能有比en_CA(加拿大英语)更多的排序规则(或显示数字等的方式).标准"C"语言环境是符合POSIX标准的默认语言环境.只有严格的ASCII字符才有效,排序和格式化规则主要是en_US(美国英语)
在计算中,locale是一组参数,用于定义用户的语言,国家和用户希望在其用户界面中看到的任何特殊变体首选项.通常,区域设置标识符至少包括语言标识符和区域标识符.
小智 15
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)
Run Code Online (Sandbox Code Playgroud)
好的,从我的阅读来看,这个初始设置似乎
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.
Run Code Online (Sandbox Code Playgroud)
基本上为您之后创建的所有数据库指定“默认”语言环境(即它指定模板 1 的设置,它是默认模板)。您可以使用不同的语言环境创建新数据库,如下所示:
区域设置与编码不同,您可以手动指定它和/或编码:
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
Run Code Online (Sandbox Code Playgroud)
如果你想手动调用它。
基本上,如果您不指定它,它将使用系统默认值,几乎从不使用“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");
Run Code Online (Sandbox Code Playgroud)
这还不够,除非默认值是“C”(或 POSIX,同样的东西)排序规则,否则它不能用于LIKE 'ABC%'. 你需要这样的东西:
CREATE INDEX my_index_name
ON table_name
USING btree
(identifier COLLATE pg_catalog."default" varchar_pattern_ops);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15825 次 |
| 最近记录: |