2009-11-03 59 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); 
相關問題