– CREATE MATERIALIZED VIEW name AS query • Обновление происходит по требованию – REFRESH MATERIALIZED VIEW name • Эффективная замена представлению, если запросы на нём стали медленными
на основе триграмм • Поддерживает GiST и GIN индексы • Ускоряет поиск подстроки (LIKE) • Позволяет использовать индекс для поиска по регулярному выражению, для которого можно составить список триграмм
WHERE _data ~ 'a{3}(b|c)? (d|f)?'; QUERY PLAN -------------------------------------------------------------------------- Bitmap Heap Scan on companies (cost=45.25..464.10 rows=108 width=365) (a Recheck Cond: (_data ~ 'a{3}(b|c)?(d|f)?'::text) Rows Removed by Index Recheck: 205 -> Bitmap Index Scan on idx_companies__data_key_gist_trgm (cost=0.00. Index Cond: (_data ~ 'a{3}(b|c)?(d|f)?'::text) Total runtime: 511.177 ms (6 rows)
WHERE _data ~ 'a{3}(b|c)? (d|f)?'; QUERY PLAN -------------------------------------------------------------------------- Bitmap Heap Scan on companies (cost=116.84..535.69 rows=108 width=367) ( Recheck Cond: (_data ~ 'a{3}(b|c)?(d|f)?'::text) Rows Removed by Index Recheck: 205 -> Bitmap Index Scan on idx_companies__data_key_trgm (cost=0.00..116. Index Cond: (_data ~ 'a{3}(b|c)?(d|f)?'::text) Total runtime: 8.295 ms (6 rows)
CouchDB, MongoDB, Redis, MySQL, но только на чтение • postgres_fdw будет в 9.3 и будет поддерживать запись • FDW легко использовать • Поддержка “фич” зависит от источника
AS some_number -# FROM (SELECT * FROM generate_series(1, 1000) AS id) AS x; INSERT 0 1000 =# SELECT * FROM remote_table ORDER BY id OFFSET 998; id | some_number ------+------------- 999 | 49 1000 | 79 (2 rows)
WHERE id = 1000; DELETE 1 =# UPDATE remote_table SET some_number = 0 WHERE id = 999; UPDATE 1 =# SELECT * FROM remote_table ORDER BY id OFFSET 998; id | some_number -----+------------- 999 | 0 (1 row)
* FROM remote_table ORDER BY id OFFSET 998; id | some_number ------+------------- 999 | 49 1000 | 79 (2 rows) -- да, postgres_fdw поддерживает транзанкции
to_json, hstore_to_json_loose • Для обработки: json_populate_recordset, json_array_elements, json_each и многие другие • Доступ к данным по ключу: ->> и #>> • Всегда можно сделать больше используя PL/V8JS Все функции имеют два варианта: – Возвращающие тип json – Другие возвращают тип text
y FROM generate_series(1,2) x) -# SELECT json_agg(z) FROM z; [{"x":1,"y":"2013-07-09 23:19:27.706936+03"}, {"x":2,"y":"2013-07-09 23:19:27.706936+03"}] =# WITH x AS (SELECT hstore('a', '123') || hstore('b', 't') AS h) -# SELECT h, hstore_to_json_loose(h) FROM x; h | hstore_to_json_loose ----------------------+---------------------- "a"=>"123", "b"=>"t" | {"a": 123, "b": true}
=# SELECT '{"a":[1,2,3]}'::json ->> 'a'; [1,2,3] =# CREATE INDEX idx_int ON companies -# (((_data #>> '{meta,highrise,id}')::int)); CREATE INDEX =# CREATE INDEX idx_text ON companies ((_data ->> 'name')); CREATE INDEX