Совещание ведущих разработчиков 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)