?

Log in

No account? Create an account

...

или внеочередные заметки


Previous Entry Share Next Entry
ICU в постгресе
trekking, Himalaya
obartunov
Решил проверить, как работает ICU в постгресе под маком и линуксом. В частности, меня интересовала возможность использования abbreviated keys, которую включили в 10-ке как раз вместе с поддержкой ICU. Если кратко, то CREATE INDEX под MAC OS X High Sierra для текста с кириллицей ускорился в 23 раза, а под Linux всего 1.4. Для английского текста под маком ускорение было около 10 раз.


Под маком мне пришлось поставить icu4c (brew install icu4c), а потом компилить вот так
PKG_CONFIG_PATH=/usr/local/opt/icu4c/lib/pkgconfig ./configure --with-icu

Внизу текст скрипта icu.sql, запускать psql -a < icu.sql
Для генерации английского текста надо поменять строчку в скрипте.
\timing on
create table tt_ru as SELECT
        (
--                SELECT string_agg(x, '')::TEXT COLLATE "ru-x-icu" as str
                SELECT string_agg(x, '') as str
                FROM (
                        SELECT chr(ascii('А') + (random() * 33)::integer)
-- use for english text
--                        SELECT chr(ascii('A') + (random() * 33)::integer)
                        FROM generate_series(1, 40 + b * 0)
                ) AS y(x)
        )
        FROM generate_series(1,1000000) as a(b);

create index on tt_ru(str);
create index on tt_ru(str collate "ru-x-icu");


Замечание 1: Чтобы узнать название collation, надо посмотреть в таблицу pg_catalog.pg_collation.
\d pg_collation;
             Table "pg_catalog.pg_collation"
    Column     |  Type   | Collation | Nullable | Default
---------------+---------+-----------+----------+---------
 collname      | name    |           | not null |
 collnamespace | oid     |           | not null |
 collowner     | oid     |           | not null |
 collprovider  | "char"  |           | not null |
 collencoding  | integer |           | not null |
 collcollate   | name    |           | not null |
 collctype     | name    |           | not null |
 collversion   | text    |           |          |



collprovider показывает источник локали - 'c' - libc, 'i' - icu.

Замечание 2: Пост Гейгана про то, что можно сделать с ICU - https://goo.gl/Y4KsWe

Вывод такой, что основной выигрыш от использования ICU - это стабильная локаль. Хорошо бы кто-нибудь прогнал скрипт под Windows.
Tags: ,