我想盡我所能優化我的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