Совещание ведущих разработчиков PostgreSQL в мае 2010 года в Оттаве, Канада, выработало список приоритетных задач для PostgreSQL 9.1.
Ведущие разработчики PostgreSQL (Я снимаю).
Josh Berkus ведет список приоритетных работ для PostgreSQL 9.1.
Список новых и наиболее важных разработок, вошедших в PostgreSQL 9.1 (Полный список изменений).
mytab: class | value -------+------- 1 | 10 1 | 20 2 | 100 2 | 200
Transaction A: Подсчитывает сумму для class=1 (30) и вставляет новую запись с class=2. Transaction B: Подсчитывает сумму для class=2 (300) и вставляет новую запись с class=1. Так как нет варианта, когда бы последовательное выполнение транзакций привело бы к непротиворечивому результату, то в SERIALIZABLE режиме выполнится только одна транзакция, а вторая откатится с ошибкой. (Если A раньше B, то B получит значение 330, а не 300. Аналогично для случая, если B исполняется раньше A). Предикативная блокировка позволит распознать такую ситуацию, при этом, она не блокирует записей, поэтому не может вызвать взаимоблокировку (deadlocks). Отмечу, что это первая продакшн-реализация SSI (статья вышла в 2008, Michael J. Cahill, Uwe Röhm, Alan D. Fekete. Serializable Isolation for Snapshot Databases. In the Proceedings of the 2008 ACM SIGMOD international conference on management of data, pages 729-738.).
Например, для поиск 10 ближайших точке, к заданной, из 1 миллиона точек:
postgres=# explain analyze select *, position <-> point(500,500) from test order by position <-> point(500,500) limit 10; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Limit (cost=39519.39..39519.42 rows=10 width=16) (actual time=480.326..480.330 rows=10 loops=1) -> Sort (cost=39519.39..42019.67 rows=1000110 width=16) (actual time=480.324..480.326 rows=10 loops=1) Sort Key: (("position" <-> '(500,500)'::point)) Sort Method: top-N heapsort Memory: 25kB -> Seq Scan on test (cost=0.00..17907.38 rows=1000110 width=16) (actual time=0.013..271.170 rows=1000000 loops=1) Total runtime: **480.353 ms** (6 rows) postgres=# create index q on test using gist ( position ); postgres=# explain analyze select *, position <-> point(500,500) from test order by position <-> point(500,500) limit 10; QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.00..0.77 rows=10 width=16) (actual time=1.041..1.200 rows=10 loops=1) -> Index Scan using q on test (cost=0.00..77208.61 rows=1000000 width=16) (actual time=1.040..1.198 rows=10 loops=1) Order By: ("position" <-> '(500,500)'::point) Total runtime: **1.226 ms**
Ускорение более чем в 400 раз достигнуто тем, что индекс возвращает записи в уже нужном порядке и не требуется вычислять все расстояния до точки и сортировать записи по расстояниям.
SECURITY LABEL [ FOR provider ] ON { TABLE object_name | COLUMN table_name.column_name | AGGREGATE agg_name (agg_type [, ...] ) | DOMAIN object_name | FOREIGN TABLE object_name FUNCTION function_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) | LARGE OBJECT large_object_oid | [ PROCEDURAL ] LANGUAGE object_name | SCHEMA object_name | SEQUENCE object_name | TYPE object_name | VIEW object_name } IS 'label' SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_t:s0';
WITH deleted_posts AS ( DELETE FROM posts WHERE created < now() - '6 months'::INTERVAL RETURNING * ), deleted_per_user as ( SELECT user_id, count(*) FROM deleted_posts GROUP BY 1 ) UPDATE counts SET posts_count = posts_count - d.count FROM deleted_per_user d WHERE d.user_id = counts.user_id;
postgres=# \dx List of installed extensions Name | Version | Schema | Description ----------+---------+------------+------------------------------------------- file_fdw | 1.0 | public | foreign-data wrapper for flat file access plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows) postgres=# \dx+ file_fdw Objects in extension "file_fdw" Object Description ----------------------------------------- foreign-data wrapper file_fdw function file_fdw_handler() function file_fdw_validator(text[],oid) (3 rows)
CREATE SERVER server_name [ TYPE 'server_type' ] [ VERSION 'server_version' ] FOREIGN DATA WRAPPER fdw_name [ OPTIONS ( option 'value' [, ... ] ) ] CREATE FOREIGN TABLE schemaname.tablename ( column_name type_name [ OPTIONS ( ... ) ] [ constraints | DEFAULT default value [...] ], ... ) INHERITS ( parent ) SERVER remote_postgresql_server OPTIONS ( ... );
В качестве примера доступа к файлам реализовано расширение file_fdw.
postgres=# CREATE SERVER file_server FOREIGN DATA WRAPPER file_fdw; postgres=# CREATE FOREIGN TABLE passwd ( username text, pass text, uid int4, gid int4, gecos text, home text, shell text ) SERVER file_server OPTIONS (format 'text', filename '/etc/passwd', delimiter ':', null ''); postgres=# select * from passwd order by uid asc limit 3; username | pass | uid | gid | gecos | home | shell ----------+------+-----+-----+--------+-----------+----------- root | x | 0 | 0 | root | /root | /bin/bash daemon | x | 1 | 1 | daemon | /usr/sbin | /bin/sh bin | x | 2 | 2 | bin | /bin | /bin/sh (3 rows) postgres=# \d List of relations Schema | Name | Type | Owner --------+--------+---------------+---------- public | passwd | foreign table | postgres public | test | table | postgres (2 rows)