3
Николай Самохвалов (nikolay at postgresmen dot ru), октябрь 2007
8 октября 2007 года Джош Беркус (Josh Berkus) объявил о выходе
PostgreSQL 8.3beta1 (см. официальный Changelog). Более полугода
потребовалось разработчикам для того, чтобы завершить работу по
обработке патчей (напомним, feature freeze состоялся 1го апреля
2007 года). Так что самое время рассказать, чем же порадует нас в
этот раз самая развитая из открытых СУБД в мире.
Я разобью весь список на четыре части. В первой, для многих самой
важной, части я перечислю изменения, которые так или иначе касаются производительности. Во
второй — приведу список новых возможностей для программистов баз данных, призванных ещё
более расширить и без того неслабый набор «фич» PostgreSQL. Третья часть посвящена
нововведениям, предназначенным для администраторов баз данных. И, наконец, в конце я
упомяну некоторые Open Source проекты, которые являются проектамиспутниками Постгреса
(другими словами, имеют свой собственный цикл разработки).
Производительность
Начнём с того, что сегодня (на данный момент стабильная ветка — 8.2, актуальная версия —
8.2.5) PostgreSQL успешно тягается в плане производительности не только с OpenSource
альтернативами, но и с ведущими коммерческими СУБД. Такими как Oracle. Это уже не пустой
звук — взгляните на результаты тестирования, проведённого в компании Sun. Медленных слонов
больше нет! Богатейший набор типов индексов, широчайшие возможности тюнинга системы,
работа с очень большими объёмами и нагрузками, хороший выбор систем репликации и
масштабирования — всё это «по зубам» современным слонам. Даже скорость разработки
выгодно отличает Постгрес по сравнению с другими СУБД: каждый год мы неизменно получаем
существенный шаг вперёд.
Следующая новинка придётся по вкусу, прежде всего, большому количеству вебразработчиков.
Начиная с версии 8.3 любую транзакцию в PostgreSQL можно делать «асинхронной».
Это означает, что при выполнении операции фиксации транзакции (COMMIT) сервер PostgreSQL
не будет ждать завершения дорогостоящей операции синхронизации журнала транзакций (WAL
fsync). Другими словами, транзакция будет считаться успешно завершённой сразу же, как только
все логические условия будут выполнены (проверены все необходимые ограничения
целостности). Физически запись в журнал транзакций произойдёт через очень малый промежуток
времени (как правило, для нормально функционирующих систем это максимум 2001000 мс).За
состояние транзакции (синхронная/асинхронная) отвечает переменная окружения
synchronous_commit. Перейти в асинхронный режим просто:
SET synchronous_commit TO OFF;
Стоит отметить, что асинхронные транзакции не являются альтернативой режиму работы сервера
с отключенной операций fsync. Дело в том, что режим fsync=off может привести к получению
несогласованного состояния базы (к примеру, в случае непредвиденного отказа оборудования
или потери питания) и рекомендуется только в тех случаях, когда используется оборудование
высокой надёжности (например, контроллер дисков с батарейкой). Использование же новой
возможности никак не может привести к рассогласованию данных. Максимум, что возможно, это
потеря небольшой порции данных (опятьтаки, в случае жёсткого сбоя сервера — ошибки ОС,
оборудования, сбой питания). Типичным примером для асинхронных транзакций может служить
задача сохранения большого количества информации в таблицужурнал (например, лог действий
пользователя), когда потеря нескольких строк не является критичной. При этом все важные
транзакции могут попрежнему быть синхронными.
Ещё одно улучшение в области производительности относится к ситуациям, когда при
выполнении запросов PostgreSQL последовательно просматривает таблицы (операция SeqScan).
Если до версии 8.3 в таких случаях нередко возникали ситуации, когда разные процесса
Постгреса одновременно делали одну и ту же работу — просматривали одну и ту же таблицу —
то теперь, благодаря реализации Synchronized Scans («синронизованные просмотры»), в один
и тот же момент времени для одной таблицы может проводиться не более одной операции
просмотра. Достигается это следующим образом. Если в рамках какойлибо сессии требуется
проведение SeqScanа для некоторой таблицы, для которой уже выполняется SeqScan (для
другой сессии), то произойдёт «прыжок на ходу» к результатам уже выполняющегося SeqScanа.
По завершении данного процесса, если это необходимо, будет осуществлён «добор» результатов
с помощью ещё одного неполного SeqScanа (см. рис).
Разработчикам баз данных
Самое заметное и существенное изменение, которое следует здесь отметить, — это миграция
модуля для полнотекстового поиска (contrib/tsearch2) в ядро системы. Разрабатываемый
российскими разработчиками Олегом Бартуновым и Фёдором Сигаевым, tsearch2 долгое время
являлся самым популярным contribмодулем Постгреса. Патч для миграции полнотекстового
поиска в ядро, который был принят этим летом в результате кропотливой и продолжительной
работы (принятая версия патча — 58!) сразу нескольких ключевых разработчиков команды
PostgreSQL, является самым большим за всю историю проекта.
Кроме того, что все возможности модуля tsearch2 теперь будут доступны по умолчанию и
процессы миграции на новую версию PostgreSQL заметно упростятся, конфигурировать словари
и правила обработки текстов теперь станет проще: все основные операции по конфигурированию
осуществляются с помощью SQLкоманд. Вот так, например, можно создать простой словарь
тезаурус:
СREATE TEXT SEARCH DICTIONARY thesaurus_astro (
TEMPLATE = thesaurus,
DictFile = thesaurus_astro,
Dictionary = english_stem
);
ALTER TEXT SEARCH CONFIGURATION russian
ADD MAPPING FOR lword, lhword, lpart_hword
WITH thesaurus_astro, english_stem;
А вот пример запроса с ранжированием по релевантности, использующий к тому же специальную
функцию plainto_tsquery для получения tsquery (позволяет забыть об экранировании символов и
быстро и просто преобразовать обычный текст в tsquery):
SELECT
ts_rank_cd(textsearch_index, q) AS rank, title
FROM
pgweb, plainto_tsquery('supernova star') q
WHERE
q @@ textsearch_index
ORDER BY
rank DESC LIMIT 10;
Другое заметное изменение — поддержка XML, в работе над которой принимал участие автор
данной статьи. Данный функционал реализован в соответствии со стандартом SQL:2003 (14я
часть стандарта, SQL/XML).
Прежде всего, появился специальный тип данных xml, встроенный в ядро. При использовании
данного типа, сервер проверяет, правильно ли сформированы данные (проверка на well
formedness). Причём возможны варианты использования, при которых разрешена работа с
частями документа (это позволяет обеспечить свойство «замкнутости» функций для работы с
XML на тип данных xml).
Для ускорения выполнения запроса к XMLданным возможно использование функциональных
btreeиндексов и GINиндексов, а также использования полнотекстового поиска для XML
данных. Приведём пример создания btreeиндекса по результатам оценки XPathвыражения:
CREATE INDEX i_table1_xdata ON table1 USING btree(
((xpath(’//person/@name’, xdata))[1])
);
Что касается типов данных, PostgreSQL 8.3 представляет целый ряд нововведений: помимо
встроенных в ядро системы типов tsquery/tsvector и xml, появились следующие:
• enum (перечислимые типы данных, определяемые пользователем) для удобства некоторых
пользователей, в том числе мигрирующих с TheirSQL;
• типы данных GUID/UUID (в виде contribмодуля);
• массивы составных типов (например, определённых пользователем типов).
И наконец, краткий список остальных изменений:
• автоматическая инвалидация кэша плана запросов для PL/pgSQLфункций;
• конструкции «CREATE FUNCTION … RETURNS TABLE» и «RETURN TABLE…» для
создания функций, результатом которых является таблица;
• поддержка операции обновления для курсоров;
• стандартная (ISO/ANSI SQL) конструкция «ORDER BY … NULLS FIRST/LAST» для
упрощения установки порядка следования NULLзначений (также помогает при миграции
с других СУБД);
• индексация NULLзначений в GiSTиндексах.
Администраторам баз данных
Данный раздел получился куцым, ибо многое из того, что призвано улучшить жизнь DBA,
описано выше :) Тем не менее, расскажем кратко о том, что осталось.
В планах запросов (команда EXPLAIN ANALYZE) теперь видно, какой именно алгоритм
сортировки был выбран и сколько памяти было израсходовано:
QUERY PLAN
-------------------------------------------------------
Sort (cost=34.38..34.42 rows=13 width=176) (actual time=0.946..0.948 rows=6
loops=1)
Sort Key: obj2tag.o2t_tag_name
Sort Method: quicksort Memory: 18kB <-- см. сюда!
-> Hash Join (cost=19.19..34.14 rows=13 width=176) (actual time=0.812..0.835
rows=6 loops=1)
[...]
Специальный contribмодуль pg_standby, написанный Саймоном Ригсом (Simon Riggs) упростит
работу администраторам, настраивающим сервер «тёплого бэкапа» (Warm Standby) на основе
трансфера журнала логов (WAL transfer). Модуль написан на чистом C, поэтому является легко
расширяемым и портируемым на новые платформы (работоспособность проверена уже, по
крайней мере, на Linux и Win32).
При определении функции теперь можно переопределять переменные окружения, которые будут
действовать только в рамках выполнения данной функции (привязка значений переменных
функциям). Например, вот так можно указать, что выполнение функции log _data() переключает
транзакцию в режим асинхронности:
ALTER FUNCTION log_data(text)
SET synchronous_commit TO OFF;
Ну и, по традиции, краткий список других новинок данного раздела:
• поддержка интерфейса GSSAPI;
• улучшенная сборка на платформе Win32 (теперь не требуется MinGW, сборка ведётся
в MS VC++, что помимо прочего приводит к улучшению производительности в Windows);
• создание таблиц по подобию с учётом индексов (пример: CREATE TABLE dict2 (LIKE
dictionary INCLUDING INDEXES)).
Дополнительные проекты
Компания EnterpriseDB (сотрудники которой являются активным разработчиками PostgreSQL,
многие изменения версии 8.3 в области производительности являются именно их заслугой)
выпустила отладчик pldebugger, который представляет собой contribмодуль, позволяющий
отлаживать PL/pgSQLфункции в стандартном инструменте для администрирования pgAdminIII
и осуществлять профайлинг.
Проект в данный момент существует в виде независимого contribмодуля (представлен на
PgFoundry) и работает на большом количестве платформ (включая Linux и Win32). Стоит
отметить, что данный модуль работает и с версией 8.2 Постгреса.
Как мы рассказывали не так давно, компания Skype (которая
использует в широко известном одноимённом проекте именно
PostgreSQL) выпустила в Open Source сразу несколько продуктов,
которые могут быть полезны большому кругу разработчиков.
Среди них прежде всего стоит отметить псевдоязык PL/Proxy,
позволяющий организовывать горизонтальное масштабирование
практически без ограничений (при условии, если вся бизнес
логика приложения реализована в виде хранимых процедур),
чрезвычайно лёгкий менеджер соединений PgBouncer. Загляните
на страничку Skype Developers Zone, вы найдёте много
интересного!
На рубеже весны и лета 2007го года вышла версия 1.0 простого и удобного инструмента для
анализа логов pgFouine. Данная программа поможет вам узнать, чем же занимался ваш
процессор (процессоры) сервера баз данных. pgFoiune анализирует логи запросов Постгреса (при
включении журнализации запросов рекомендуется вводить ограничение по времени снизу, см.
описание параметра log_min_duration_statement), предоставляя отчёты по самым медленным
запросам, ошибкам и общую статистику (см. примеры). Тем самым данный инструмент позволяет
разработчику баз данных понять, какие запросы можно улучшить, чтобы ускорить работу
приложения, использующего PostgreSQL.
И наконец, кратко об остальных продуктах:
• проект pgSNMP является реализацией SNMPагента для PostgreSQL (мониторинг
состояния сервера);
• SEPostgres – расширение, основанное на модели обеспечения усиленной безопасности
SELinux;
• создан инструмент, создающий рекомендации администратору баз данных по созданию
индексов и показывающий возможный план выполнения запроса при условии наличия
таких индексов (Index Advisor);
• в известном инструменте для webадминистрирования phppgadmin появились (или вот
вот появятся) возможности настройки Slonyкластера, полнотекстового поиска,
параметров автовакуума.
Заключение
Версия 8.3 является очередным шагом на пути к полноценной системе управления баз данных
для корпоративного использования. Нетривиальные улучшения в области производительности,
появление возможностей, которые продиктованы нуждами пользователей, расширение множества
проектовспутников — всё это демонстрирует уверенное и быстрое развитие PostgreSQL.
При написании данного обзора автор использовал следующие источники:
• pgwiki/WhatsNew83
• pgwiki/Feature_Matrix
• pgwiki/8.3_Changelog
• pgwiki/Todo:PatchStatus
• Доклад Брюса Момджана на конференции Highload2007, Москва (pdf).
• Официальная документация PostgreSQL 8.3.
• Архив рассылки pgsqlhackers.