СЕРГЕЙ СУПРУНОВ
PostgreSQL 8.0: новые возможности
В середине января этого года вышла новая версия открытой системы управления базами данных PostgreSQL 8.0. Основные характеристики этой СУБД были рассмотрены ранее на страницах журнала (см. статью «PostgreSQL: первые шаги», №7, 2004 г.). По сравнению с 7-й веткой (на данный момент это версия 7.4.7) в 8-й версии появился ряд нововведений, краткому обзору которых и посвящена эта статья.
Помимо традиционных исправлений недоработок, выявленных в прежних версиях, и общих улучшений, смена «мажорной» версии ознаменовалась рядом принципиальных новшеств, направленных прежде всего на расширение возможностей по управлению СУБД.
Итак, добавлено понятие табличного пространства (table spaces). Раньше хранилище данных размещалось в директории, указанной при инициализации командой initdb, то есть жестко определялось на стадии инсталляции СУБД и могло находиться только на одной файловой системе. Проблемы со свободным местом приходилось решать либо с помощью переноса хранилища в другой раздел диска и размещения символьной ссылки на него, либо повторной инициализацией хранилища с последующим восстановлением данных из резервной копии. Теперь команда «CREATE TABLESPACE» позволяет создать несколько табличных пространств на разных файловых системах. И в дальнейшем при создании новой базы данных (CREATE DATABASE), таблицы (CREATE TABLE), индекса (CREATE INDEX) и т. д. можно указать, в каком табличном пространстве следует разместить объекты. Это помогает более гибко управлять размещением данных на диске и в ряде случаев повышает быстродействие, например, за счет выноса индексных файлов в табличное пространство, расположенное на отдельном жестком диске.
Команда «ALTER TABLE» позволяет теперь изменять тип данных столбца. Раньше для этого требовалось создать новый столбец, перенести в него данные и затем старый удалить. До версии 7.3 удалять столбцы тоже было нельзя, и приходилось либо мириться с тем, что никому не нужный столбец занимает место, либо менять структуру таблицы самым универсальным способом – создавая на ее основе новую. Теперь для этого достаточно одной команды:
ALTER TABLE test ALTER COLUMN mynum TYPE NUMERIC(4,2);
Старый и новый типы должны быть совместимы. То есть вы можете изменить тип numeric(5,2) на numeric(9,2), чтобы хранить большие числа, но попытка изменить, например, числовой тип на строковый приведет к ошибке.
Также в новой версии появились так называемые точки сохранения транзакций (savepoints). В ранних версиях в случае ошибки внутри транзакции она «откатывалась» полностью, что в сложных транзакциях (например, при отработке функций) приводило к значительной трате ресурсов. Теперь есть возможность в потенциально опасных местах транзакции размещать savepoints и в дальнейшем при обработке ошибки откатывать транзакцию только до указанной точки сохранения. Для этого используется команда «ROLLBACK TO savepointname», где savepointname – имя точки сохранения, присвоенное ей командой «SAVEPOINT savepointname». После устранения причины ошибки обработка транзакции продолжится, при этом операции, выполненные нормально, повторяться не будут.
Команда «COPY», которая служит для загрузки данных в таблицу из внешних файлов и сохранения данных из таблиц в файлы, раньше поддерживала текстовый формат с разделителями и собственный двоичный формат. Теперь она поддерживает также работу с файлами в формате CSV (comma separated value), что упрощает обмен данными между PostgreSQL и, скажем, файлами Excel. Например, чтобы сохранить данные из CSV-файла, требуется подготовить таблицу, столбцы которой соответствуют по типу полям загружаемого файла. Затем выполняется команда:
COPY mytable FROM ‘/path/to/file.csv’ WITH CSV;
В результате данные из file.csv допишутся в конец таблицы mytable. Каждая строка файла становится одной записью, в качестве разделителя полей будет использован символ «запятая». Этот вариант простейший, в общем случае можно явно указывать поля таблицы, которые будут заполняться из файла, и их порядок, а также задавать ряд дополнительных параметров. Подробности смотрите в справке (например, введя команду «h copy» в интерактивном терминале psql).
Обновлена версия встроенного языка PL/Perl, позволяющего разрабатывать хранимые процедуры на языке Perl. Напомню, что помимо PL/pgSQL и PL/Perl, PostgreSQL позволяет использовать для разработки серверной части приложений также языки Python (PL/Python) и Tcl (PL/Tcl). С сайта www.postgresql.org дополнительно можно скачать и установить модули, обеспечивающие поддержку языков PHP, Java и др. Разработчики PostgreSQL уделили должное внимание и системам от Microsoft – теперь выпускается «родная» версия этой СУБД для Windows 2000/2003/XP. Раньше тоже можно было запускать PostgreSQL в Windows, но под управлением UNIX-эмулятора Cygwin, что крайне отрицательно сказывалось на быстродействии и требовательности к ресурсам и практически не позволяло говорить о «промышленной» эксплуатации PostgreSQL на этих операционных системах. Таким образом, можно констатировать тот факт, что PostgreSQL по своим характеристикам все больше приближается к таким коммерческим «монстрам» как Oracle. Конечно, по отношению к Oracle PostgreSQL по-прежнему находится в роли догоняющего, однако разрыв сокращается с каждым новым релизом, и выбор этой бесплатной СУБД становится все более предпочтительным.