PostgreSQL (произносится «Постгре-Эс-Кю-Эль»[1], в профессиональной среде коротко называется «постгрес») — свободная объектно-реляционная система управления базами данных (СУБД).

Существует в реализациях для следующих платформ: Linux, Solaris/OpenSolaris, Win32, Win x86-64, Mac OS X, FreeBSD, QNX 4.25, QNX 6.

Поддержка стандартов, возможности, особенностиПравить

PostgreSQL базируется на языке SQL и поддерживает многие из возможностей стандарта SQL:2003 (ISO/IEC 9075)[2].

На данный момент (версия 8.4.0), в PostgreSQL имеются следующие ограничения:[3]

Максимальный размер базы данных Нет ограничений
Максимальный размер таблицы 32 ТБайт
Максимальный размер записи 1,6 ТБайт
Максимальный размер поля 1 ГБайт
Максимум записей в таблице Нет ограничений
Максимум полей в таблице 250—1600, в зависимости от типов полей
Максимум индексов в таблице Нет ограничений

Сильными сторонами PostgreSQL считаются:

История разработкиПравить

Постгрес начали разрабатывать студенты Университета Беркли в 80-х годах прошлого века. Первоначальным проектом «Ingres» руководил профессор Майкл Стоунбрейкер. Post-gres — сокращение от «Post Ingres».

Основные возможностиПравить

ФункцииПравить

Функции являются блоками кода, исполняемыми на сервере, а не на клиенте БД. Хотя они могут писаться на чистом SQL, реализация дополнительной логики, например, условных переходов и циклов, выходит за рамки собственно SQL и требует использования некоторых языковых расширений. Функции могут писаться с использованием одного из следующих языков:

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)
  • Типы «дата/время» (полностью поддерживающие различные форматы, точность, форматы вывода, включая последние изменения в часовых поясах)
  • Булев тип
  • Перечисление
  • Геометрические примитивы
  • Сетевые типы
  • UUID—идентификатор
  • XML—данные
  • Массивы
  • OID—типы
  • Псевдотипы

Более того, пользователь может самостоятельно создавать новые требуемые ему типы и программировать для них механизмы индексирования с помощью GiST.

Пользовательские объектыПравить

PostgreSQL может быть расширен пользователем для собственных нужд практически в любом аспекте. Есть возможность добавлять собственные:

  • Преобразования типов
  • Типы данных
  • Домены (пользовательские типы с изначально наложенными ограничениями)
  • Функции (включая агрегатные)
  • Индексы
  • Операторы (включая переопределение уже существующих)
  • Процедурные языки

НаследованиеПравить

Таблицы могут наследовать характеристики и наборы полей от других таблиц (родительских). При этом данные, добавленные в порождённую таблицу, автоматически будут участвовать (если это не указано отдельно) в запросах к родительской таблице.

Данный функционал в текущее время не является полностью завершённым. Однако он достаточен для практического использования.

Прочие возможностиПравить

  • Соблюдение принципов ACID.
  • Соответствие стандартам ANSI SQL-92 и SQL-99.
  • Поддержка запросов с OUTER JOIN, UNION, UNION ALL, EXCEPT, INTERSECT и подзапросов.
  • Последовательности.
  • Контроль целостности.
  • Репликация.
  • Общие табличные выражения и рекурсивные запросы
  • Аналитические функции
  • Поддержка Юникода (UTF-8).
  • Поддержка регулярных выражений в стиле Perl.
  • Встроенная поддержка SSL и Kerberos.
  • Протокол разделяемых блокировок.
  • Подгружаемые расширения, поддерживающие SHA1, MD5, XML и другую функциональность (API открыт).
  • Средства для генерации совместимого с другими системами SQL-кода и импорта из других систем.

НадёжностьПравить

Согласно результатам автоматизированного исследования различного ПО на предмет ошибок, в исходном коде PostgreSQL было найдено 20 проблемных мест на 775 000 строк исходного кода (в среднем, одна ошибка на 39 000 строк кода).[5] Для сравнения: MySQL — 97 проблем, одна ошибка на 4 000 строк кода; FreeBSD (целиком) — 306 проблем, одна ошибка на 4 000 строк кода; Linux (только ядро) — 950 проблем, одна ошибка на 10 000 строк кода.

Коммерческие расширенияПравить

На базе PostgreSQL компанией EnterpriseDB созданы более мощные варианты этой СУБД, являющиеся платными для коммерческого использования — Postgres Plus (состоит целиком только из продуктов с открытыми исходными кодами; плата требуется только при необходимости приобретения коммерческой поддержки продукта) и Postgres Plus Advanced Server (расширение PostgreSQL специальными возможностями для обеспечения совместимости с Oracle Database) [6]. В комплекте поставки данных продуктов содержится большой набор ПО для разработчиков и DBA:

  • Postgres Studio — более мощный аналог pgAdmin;
  • Postgres Plus Debugger — отладчик для кода на PL/pgSQL, интегрированный с предыдущим пакетом;
  • Migration Studio — инструмент для автоматического преобразования баз данных из MySQL/Oracle в PostgreSQL

Дальнейшее развитиеПравить

На версию 9.0.* запланировано введение в состав СУБД следующих возможностей:

  • подключения к внешним источникам данных SQL/MED (Management of External Data)
  • доступ только к индексам при некоторых выборках
  • анонимные блоки на любом доступном языке хранимых процедур
  • отложенные ограничения уникальности
  • Более простой синтаксис для секционированных таблиц
  • Горячий резерв
  • Планы запросов в виде JSON и XML
  • Триггеры, срабатывающие при обновлении определённых колонок таблицы

Править

  • Search PostgreSQL sites (англ.) // Специализированный поиск по ресурсам PostgreSQL


  1. Так же можно встретить произношение «Пост-Грес-Кью-Эл». В этой статье основной пример произношения приведён из-за того что он подчёркивает базовую аббревиатуру SQL, которая ещё выделяется и в официальных документах по этой СУБД (в разделе «Исторический очерк» вы можете прочитать чем вызваны такие неопределённости).
  2. PostgreSQL 8.4.5 Documentation. Appendix D. SQL Conformance
  3. PostgreSQL: About
  4. PostgreSQL 8.4.5 Documentation. Chapter 37. Procedural Languages
  5. "PostgreSQL Achieves Coverity Quality Certification". PostgreSQL Global Development Group. Archived from the original on 2011-08-24. Retrieved 2009-09-08.  Unknown parameter |description= ignored (help); Unknown parameter |accessyear= ignored (help); Unknown parameter |lang= ignored (help); Unknown parameter |datepublished= ignored (help)
  6. "Подход к миграции баз данных с Oracle на EnterpriseDB". Бюро Соломатина. Archived from the original on 2011-08-24. Retrieved 2010-12-13.  Unknown parameter |description= ignored (help); Unknown parameter |accessyear= ignored (help); Unknown parameter |lang= ignored (help); Unknown parameter |datepublished= ignored (help)