PostgreSQL – свободная объектно-реляционная система управления базами данных
(СУБД).
Поддержка стандартов, возможности, особенности
PostgreSQL базируется на языке SQL и поддерживает многие из возможностей
стандарта SQL:2011.
На данный момент PostgreSQL имеются следующие ограничения:
- Максимальный размер базы данных: нет ограничений
- Максимальный размер таблицы: 32 Тбайт
- Максимальный размер записи: 1,6 Тбайт
- Максимальный размер поля: 1 Гбайт
- Максимум записей в таблице: нет ограничений
- Максимум полей в записи: 250 - 1600, в зависимости от типов полей
- Максимум индексов в таблице: нет ограничений
Важнейшие ТТХ PostgreSQL
- Надежность и устойчивость. Надежность PostgreSQL является известным фактом,
доказанным на примере многих проектов, в которых PostgreSQL работает без
сбоев под высокими нагрузками на протяжении нескольких лет. * Превосходная
поддержка. Сообщество PostgreSQL предоставляет квалифицированную и быструю
помощь. Коммерческие компании предлагают свои услуги по всему миру.
- Конкурентная работа при большой нагрузке. PostgreSQL использует
многоверсионность (MVCC) для обеспечения надежной и быстрой работы в
конкурентных условиях под высокой нагрузкой. * Масштабируемость. PostgreSQL
отлично использует современную архитектуру многоядерных процессоров – его
производительность растет линейно вплоть до 64-х ядер. Кластерные решения на
основе Postgres-XC, Postgres-XL помогают с горизонтальной масштабируемостью.
- Кроссплатформенность. PostgreSQL работает под всеми видами UNIX-подобных
систем, включая Linux, FreeBSD, Solaris, HP/UX, Mac OS X, а также под MS
Windows. * Расширяемость. Доступны исходные коды PostgreSQL, что делает
возможным добавление новой функциональности для вашего проекта без
дополнительных проблем. Расширяемость PostgreSQL позволяет создавать новые
типы данных и методы доступа.
- Доступность. PostgreSQL распространяется под лицензией, близкой к BSD,
которая не накладывает никаких ограничений на коммерческое использование и не
требует лицензионных выплат.
Основные возможности
- Высокий уровень соответствия ANSI SQL 92, ANSI SQL 99 и ANSI SQL 2003, 2011.
- Интерфейсы для Tcl, Perl, C, C++, PHP, JSON, ODBC, JDBC, Embedded SQL in C,
Python, Ruby, Java и других. * Интеграция защиты данных с операционной
системой (SE-Linux).
- Представления, последовательности, наследование, outer joins, подзапросы,
ссылочная целостность, оконные функции, CTE (рекурсивные запросы).
- Пользовательские функции, хранимые процедуры, триггеры.
- Процедурные языки PL/PgSQL, PL/Perl, PL/Python, PL/Java и другие.
- Расширяемый набор типов данных с поддержкой индексов (GiST, GIN, SP-GiST).
- Встроенная система полнотекстового поиска с поддержкой всех европейских
языков.
- Встроенная поддержка слабоструктурированных данных (xml, json, jsonb) с
поддержкой индексов.
- Горячее резервирование и репликация (синхронная, асинхронная, каскадная),
PITR, двунаправленная (BDR).
- Полная поддержка ACID, уровни изоляции, эффективная сериализация транзакций.
- Функциональные и частичные индексы.
- Интернационализация, поддержка Unicode и locale.
- Загружаемые расширения, например, PostGIS, hstore.
- Поддержка SSL и Kerberos-аутентификации.
- Foreign Data Wrappers (writable), поддержка всех основных баз данных.
Функции
Функции являются блоками кода, исполняемыми на сервере, а не на клиенте БД.
Хотя они могут писаться на чистом SQL, реализация дополнительной логики,
например, условных переходов и циклов, выходит за рамки собственно SQL и
требует использования некоторых языковых расширений. Функции могут писаться с
использованием одного из следующих языков:
- Встроенный процедурный язык PL/pgSQL, во многом аналогичный языку PL/SQL,
используемому в СУБД Oracle;
- Скриптовые языки – PL/Lua, PL/LOLCODE, PL/Perl, PL/PHP, PL/Python, PL/Ruby,
PL/sh, PL/Tcl и PL/Scheme;
- Классические языки – C, C++, Java (через модуль PL/Java);
- Статистический язык R (через модуль PL/R).
PostgreSQL допускает использование функций, возвращающих набор записей, который
далее можно использовать так же, как и результат выполнения обычного запроса.
Функции могут выполняться как с правами их создателя, так и с правами текущего
пользователя.
Иногда функции отождествляются с хранимыми процедурами, однако между этими
понятиями есть различие. С девятой версии возможно написание автономных блоков,
которые позволяют выполнять код на процедурных языках без написания функций,
непосредственно в клиенте.
Триггеры
Триггеры определяются как функции, инициируемые DML-операциями. Например,
операция INSERT может запускать триггер, проверяющий добавленную запись на
соответствия определённым условиям. При написании функций для триггеров могут
использоваться различные языки программирования.
Триггеры ассоциируются с таблицами. Множественные триггеры выполняются в
алфавитном порядке.
Правила и представления
Механизм правил (rules) представляет собой механизм создания пользовательских
обработчиков не только DML-операций, но и операции выборки. Основное отличие от
механизма триггеров заключается в том, что правила срабатывают на этапе разбора
запроса, до выбора оптимального плана выполнения и самого процесса выполнения.
Правила позволяют переопределять поведение системы при выполнении SQL-операции
к таблице.
Хорошим примером является реализация механизма представлений (views). При
создании представления создается правило, которое определяет, что вместо
выполнения операции выборки к представлению система должна выполнять операцию
выборки к базовой таблице/таблицам с учетом условий выборки, лежащих в основе
определения представления. Для создания представлений, поддерживающих операции
обновления, правила для операций вставки, изменения и удаления строк должны
быть определены пользователем.
Индексы
В PostgreSQL имеется поддержка индексов следующих типов: B-дерево, хэш,
R-дерево, GiST, GIN. При необходимости можно создавать новые типы индексов,
хотя это далеко не тривиальный процесс.
Индексы в PostgreSQL обладают следующими свойствами:
- возможен просмотр индекса не только в прямом, но и в обратном порядке –
создание отдельного индекса для работы конструкции
ORDER BY ... DESC
не
нужно;
- возможно создание индекса над несколькими столбцами таблицы, в том числе над
столбцами различных типов данных;
- индексы могут быть функциональными, т.е. строиться не на базе набора значений
некоего столбца(ов), а на базе набора значений функции от набора значений;
- индексы могут быть частичными, то есть строиться только по части таблицы (по
некоторой её проекции); в некоторых случаях это помогает создавать намного
более компактные индексы или достигать улучшения производительности за счёт
использования разных типов индексов для разных (например, с точки зрения
частоты обновления) частей таблицы;
- планировщик запросов может использовать несколько индексов одновременно для
выполнения сложных запросов.
Многоверсионность (MVCC)
PostgreSQL поддерживает одновременную модификацию БД несколькими пользователями
с помощью механизма Multiversion Concurrency Control (MVCC). Благодаря этому
соблюдаются требования ACID, и практически отпадает нужда в блокировках чтения.
Типы данных
PostgreSQL поддерживает большой набор встроенных типов данных:
- Численные типы
- Целые
- С фиксированной точкой
- С плавающей точкой
- Денежный тип (отличается специальным форматом вывода, а в остальном
аналогичен числам с фиксированной точкой с двумя знаками после запятой)
- Символьные типы произвольной длины
- Двоичные типы (включая BLOB)
- Типы «дата/время» (полностью поддерживающие различные форматы, точность,
форматы вывода, включая последние изменения в часовых поясах)
- Булев тип
- Перечисление
- Геометрические примитивы
- Сетевые типы
- IP и IPv6-адреса
- CIDR-формат
- MAC-адрес
- UUID-идентификатор
- XML-данные
- Массивы
- JSON
- Идентификаторы объектов БД
- Псевдотипы
- Типы для текстового поиска
- Диапазонные типы
Более того, пользователь может самостоятельно создавать новые требуемые ему
типы и программировать для них механизмы индексирования с помощью GiST.
Пользовательские объекты
PostgreSQL может быть расширен пользователем для собственных нужд практически в
любом аспекте. Есть возможность добавлять собственные:
- Преобразования типов
- Типы данных
- Домены (пользовательские типы с изначально наложенными ограничениями)
- Функции (включая агрегатные)
- Индексы
- Операторы (включая переопределение уже существующих)
- Процедурные языки
Наследование
Таблицы могут наследовать характеристики и наборы полей от других таблиц
(родительских). При этом данные, добавленные в порождённую таблицу,
автоматически будут участвовать (если это не указано отдельно) в запросах к
родительской таблице.
Коммерческие расширения
На базе PostgreSQL компанией EnterpriseDB созданы более мощные варианты этой
СУБД, являющиеся платными для коммерческого использования – Postgres Plus
(состоит целиком только из продуктов с открытыми исходными кодами; плата
требуется только при необходимости приобретения коммерческой поддержки
продукта) и Postgres Plus Advanced Server (расширение PostgreSQL специальными
возможностями для обеспечения совместимости с Oracle Database). В комплекте
поставки данных продуктов содержится большой набор ПО для разработчиков и DBA:
- Postgres Studio – более мощный аналог pgAdmin;
- Postgres Plus Debugger – отладчик для кода на PL/pgSQL, интегрированный с
предыдущим пакетом;
- Migration Studio – инструмент для автоматического преобразования баз данных
из MySQL / Oracle в PostgreSQL
Заключение
PostgreSQL на данный момент является одной из самых (если не самой-самой)
перспективных СУБД в мире. Благодаря великолепной архитектуре, бесплатности,
отличному сообществу и огромнейшим возможностям.
Обычно PostgreSQL сравнивают с MySQL. Но на данный момент PostgreSQL далеко
обходит по возможностям MySQL. И, благодаря своим возможностям по аналитике
данных и манипулированию ими, зачастую может конкурировать с признанными
лидерами рынка enterprise-СУБД: Oracle и MS SQL.
А благодаря своим возможностям в области хранения нереляционных данных (JSON,
text search types, HStore) PostgreSQL напрямую конкурирует с NoSQL-решениями
(например, MongoDB).