1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-22 23:02:54 +03:00
postgres/doc/src/FAQ/FAQ_russian.html
2005-01-01 22:14:33 +00:00

1496 lines
69 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01 transitional//EN">
<HTML>
<!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
<HEAD>
<META name="generator" content="HTML Tidy, see www.w3.org">
<META http-equiv="Content-Type" content="text/html; charset=koi8-r">
<TITLE>PostgreSQL FAQ</TITLE>
</HEAD>
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000" alink="#0000ff">
<H1>Ответы на часто задаваемые вопросы по PostgreSQL</H1>
<P>Дата последнего обновления: Вторник 31 августа 23:28:03 EDT 2004</P>
<P>Английский вариант сопровождает: Брюс Момьян (Bruce Momjian) (<A href=
"mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR>
</P>
<P>Перевел на русский: Виктор Вислобоков (<A href=
"mailto:pgman@candle.pha.pa.us">corochoone@perm.ru</A>)<BR>
</P>
<P>Самую свежую английскую версию документа можно найти на
<A href="http://www.postgresql.org/docs/faqs/FAQ.html">http://www.PostgreSQL.org/docs/faqs/FAQ.html</A>.</P>
<P>Ответы на вопросы специфичные для конкретных платформ можно найти на
<A href="http://www.postgresql.org/docs/index.html">http://www.PostgreSQL.org/docs/index.html</A>.</P>
<HR>
<H2 align="center">Общие вопросы</H2>
<A href="#1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название?<BR>
<A href="#1.2">1.2</A>) Каковы авторские права на PostgreSQL?<BR>
<A href="#1.3">1.3</A>) На каких Unix платформах работает PostgreSQL?<BR>
<A href="#1.4">1.4</A>) Существуют ли версии портированные не на Unix системы?<BR>
<A href="#1.5">1.5</A>) Где можно взять PostgreSQL?<BR>
<A href="#1.6">1.6</A>) Где получить поддержку?<BR>
<A href="#1.7">1.7</A>) Какая версия последняя?<BR>
<A href="#1.8">1.8</A>) Какая документация имеется в наличии?<BR>
<A href="#1.9">1.9</A>) Как найти информацию об известных ошибках или отсутствующих
возможностях?<BR>
<A href="#1.10">1.10</A>) Как научиться <SMALL>SQL</SMALL>?<BR>
<A href="#1.11">1.11</A>) Решена ли в PostgreSQL проблема 2000-го года (Y2K)?<BR>
<A href="#1.12">1.12</A>) Как присоединится к команде разработчиков?<BR>
<A href="#1.13">1.13</A>) Как отправить сообщение об ошибке?<BR>
<A href="#1.14">1.14</A>) Как сравнивать PostgreSQL с другими
<SMALL>СУБД</SMALL>?<BR>
<A href="#1.15">1.15</A>) Как оказать финансовую помощь PostgreSQL?<BR>
<H2 align="center">Вопросы пользователей по клиентской части</H2>
<A href="#2.1">2.1</A>) Существуют ли <SMALL>ODBC</SMALL> драйвера для
PostgreSQL?<BR>
<A href="#2.2">2.2</A>) Какие инструменты существуют для использования
PostgreSQL через Web?<BR>
<A href="#2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
пользователя?<BR>
<A href="#2.4">2.4</A>) Какие языки могут взаимодействовать с
PostgreSQL?<BR>
<H2 align="center">Вопросы администрирования</H2>
<A href="#3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
от <I>/usr/local/pgsql</I>?<BR>
<A href="#3.2">3.2</A>) Когда я запускаю <I>postmaster</I>, я получаю
сообщение <I>Bad System Call</I> или сообщение core dumped. Почему?<BR>
<A href="#3.3">3.3</A>) Когда я пытаюсь запустить <I>postmaster</I>, я
получаю ошибки <I>IpcMemoryCreate</I>. Почему?<BR>
<A href="#3.4">3.4</A>) Когда я пытаюсь запустить <I>postmaster</I>, я
получаю ошибки <I>IpcSemaphoreCreate</I>. Почему?<BR>
<A href="#3.5">3.5</A>) Как мне управлять соединениями с других
компьютеров?<BR>
<A href="#3.6">3.6</A>) Какие настройки мне нужно сделать для улучшения
производительности?<BR>
<A href="#3.7">3.7</A>) Какие возможности для отладки есть в наличии?<BR>
<A href="#3.8">3.8</A>) Почему я получаю сообщение <I>"Sorry, too many
clients"</I> когда пытаюсь подключиться к базе?<BR>
<A href="#3.9">3.9</A>) Что находится в каталоге <I>pgsql_tmp</I>?<BR>
<A href="#3.10">3.10</A>) Почему необходимо делать dump и restore при
обновлении выпусков PostgreSQL?<BR>
<A href="#3.11">3.11</A>) Какое компьютерное "железо" я должен
использовать?<BR>
<H2 align="center">Вопросы эксплуатации</H2>
<A href="#4.1">4.1</A>) В чем отличие между бинарным и нормальным
курсором?<BR>
<A href="#4.2">4.2</A>) Как выполнить <SMALL>SELECT</SMALL> только
для нескольких первых строчек запроса? Для произвольной строки?<BR>
<A href="#4.3">4.3</A>) Как получить список таблиц или других
компонентов в <I>psql</I>?<BR>
<A href="#4.4">4.4</A>) Как удалить колонку из таблицы или изменить
её тип данных?<BR>
<A href="#4.5">4.5</A>) Каковы максимальные размеры для записей,
таблиц и базы данных?<BR>
<A href="#4.6">4.6</A>) Как много дискового пространства в базе данных
нужно для сохранения данных из обычного текстового файла?<BR>
<A href="#4.7">4.7</A>) Как мне убедиться, что существуют нужные мне
таблицы, индексы, базы данных и пользователи?<BR>
<A href="#4.8">4.8</A>) У меня медленно работают запросы или не
происходит использования индексов. Почему?<BR>
<A href="#4.9">4.9</A>) Как посмотреть на то, как оптимизатор выполняет
мой запрос?<BR>
<A href="#4.10">4.10</A>) Что такое R-tree индекс?<BR>
<A href="#4.11">4.11</A>) Что такое Genetic Query Optimizer?<BR>
<A href="#4.12">4.12</A>) Как мне выполнить поиск регулярного выражения
и поиск независимый от регистра букв поиск регулярного выражения?
Как мне использовать индекс для поиска независимого от регистра букв?<BR>
<A href="#4.13">4.13</A>) Как я могу определить, что значение поля равно
<SMALL>NULL</SMALL> в каком-либо запросе?<BR>
<A href="#4.14">4.14</A>) Каковы отличия между разными символьными
типами?<BR>
<A href="#4.15.1">4.15.1</A>) Как мне создать поле serial/с-авто-увеличением?<BR>
<A href="#4.15.2">4.15.2</A>) Как мне получить значение при вставке
<SMALL>SERIAL</SMALL>?<BR>
<A href="#4.15.3">4.15.3</A>) Не может ли получиться так, что
использование <I>currval()</I> и <I>nextval()</I> приведет к
зациклированию с другими пользователями?<BR>
<A href="#4.15.4">4.15.4</A>) Почему числа из моей последовательности
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?<BR>
<A href="#4.16">4.16</A>) Что такое <SMALL>OID</SMALL>? Что такое
<SMALL>TID</SMALL>?<BR>
<A href="#4.17">4.17</A>) Что означают некоторые термины используемые в
PostgreSQL?<BR>
<A href="#4.18">4.18</A>) Почему я получаю ошибку <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?<BR>
<A href="#4.19">4.19</A>) Как мне узнать, какая версия PostgreSQL
запущена?<BR>
<A href="#4.20">4.20</A>) Почему при работе с моим большим объектом
я получаю ошибку <I>"invalid large obj descriptor"</I>?<BR>
<A href="#4.21">4.21</A>) Как мне создать колонку которая по умолчанию
будет содержать текущее время?<BR>
<A href="#4.22">4.22</A>) Почему мои подзапросы, использующие
<CODE><SMALL>IN</SMALL></CODE> так медленно работаеют?<BR>
<A href="#4.23">4.23</A>) Как выполнить внешнее связывание?<BR>
<A href="#4.24">4.24</A>) Как выполнять запросы, использующие несколько
баз данных?<BR>
<A href="#4.25">4.25</A>) Как мне вернуть из функции несколько записей?<BR>
<A href="#4.26">4.26</A>) Почему я не могу надежно создавать/удалять
временные таблицы в функциях PL/PgSQL?<BR>
<A href="#4.27">4.27</A>) Какие опции репликации существуют?<BR>
<A href="#4.28">4.28</A>) Какие опции шифрования существуют?<BR>
<H2 align="center">Расширения PostgreSQL</H2>
<A href="#5.1">5.1</A>) Я написал функцию определяемую пользователем.
Когда я запускаю ее в <I>psql</I>, почему я получаю core dump?<BR>
<A href="#5.2">5.2</A>) Как я могу внести некоторые классные новые
типы и функции в PostgreSQL?<BR>
<A href="#5.3">5.3</A>) Как мне написать C функцию, возвращающую
запись?<BR>
<A href="#5.4">5.4</A>) Я изменил исходный файл. Почему после
перекомпиляции я не вижу изменений?<BR>
<HR>
<H2 align="center">Общие вопросы</H2>
<H4><A name="1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название?</H4>
<P>PostgreSQL произносится <I>Post-Gres-Q-L (Пост-Грес-Кью-Эл)</I>.
По адресу http://www.postgresql.org/postgresql.mp3 доступен звуковой
файл с примером как это нужно произносить.</P>
<P>PostgreSQL - это расширение СУБД POSTGRES (и поэтому иногда
говорят просто "Postgres"), исследовательский
прототип нового поколения <SMALL>СУБД</SMALL>.
PostgreSQL одновременно сохраняет мощную модель данных и общирное
количество типов POSTGRES, и замещает язык запросов PostQuel на
расширенное подмножество <SMALL>SQL</SMALL>. PostgreSQL - это
свободное и полностью открытое программное обеспечение.</P>
<P>Разработку PostgreSQL выполняет команда разработчиков, все участники
которой подписаны на список рассылки разработчиков. В настоящее время,
их координатором является Марк Фурнье (Marc G. Fournier) (<A href=
"mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</A>). (См.
секцию <A href="#1.6">1.6</A> о том, как подключиться к разработке).
Эта команда теперь отвечает за всю разработку PostgreSQL. Данный
проект является общественным и не управляется какой-либо компанией.
Подробности смотрите в FAQ для разработчиков,
<A href="http://www.postgresql.org/docs/faqs/FAQ_DEV.html">http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html</A>
</P>
<P>Авторами PostgreSQL 1.01 являются Эндрю Ю (Andrew Yu) и Джоли Чен
(Jolly Chen). Многие другие внесли свой вклад в перенос на другие
платформы, тестирование, отладку и расширение этого кода. Первоначальный
код Postgres, из которого появился PostgreSQL, был итогом усилий многих
академических студентов, неакадемических студентов и множества
разных программистов, работавших под руководством профессора
Майкла Стоунбрейкера (Michael Stonebraker) в Калифорнийском университете,
Беркли.</P>
<P>Первоначальное имя, данное в Беркли, было Postgres. Когда
в 1995 году была добавлена функциональность <SMALL>SQL</SMALL>,
это имя было изменено на Postgres95. Но и это имя было изменено
в конце 1996 на PostgreSQL.</P>
<H4><A name="1.2">1.2</A>) Каковы авторские права на PostgreSQL?</H4>
<P>PostgreSQL попадает под действие следующего COPYRIGHT:</P>
<P>Система Управления Базами Данных PostgreSQL</P>
<P>Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of California</P>
<P>Предоставляются права на использование, копирование, изменение
и распространение данного программного обеспечения и его документации
для любых целей, бесплатно и без подписания какого-либо соглашения,
при условии что для каждой копии будут предоставлены данное выше
замечание об авторских правах, текущий параграф и два следующих
параграфа.</P>
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ
ЗА ЛЮБЫЕ ПОВРЕЖДЕНИЯ, ВКЛЮЧАЯ ПОТЕРЮ ДОХОДА, НАНЕСЕННЫЕ ПРЯМЫМ
ИЛИ НЕПРЯМЫМ, СПЕЦИАЛЬНЫМ ИЛИ СЛУЧАЙНЫМ ИСПОЛЬЗОВАНИЕМ ДАННОГО
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ
КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ БЫЛ ИЗВЕЩЕН О ВОЗМОЖНОСТИ ТАКИХ
ПОВРЕЖДЕНИЙ.</P>
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ СПЕЦИАЛЬНО ОТКАЗЫВАЗЫВАЕТСЯ ПРЕДОСТАВЛЯТЬ
ЛЮБЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ТОЛЬКО ЭТИМИ ГАРАНТИЯМИ:
НЕЯВНЫЕ ГАРАНТИИ ПРИГОДНОСТИ ТОВАРА ИЛИ ПРИГОДНОСТИ ДЛЯ ОТДЕЛЬНОЙ ЦЕЛИ.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ ПРИЦИПА
"КАК ЕСТЬ" И КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ ОБЯЗАН ПРЕДОСТАВЛЯТЬ
СОПРОВОЖДЕНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, РАСШИРЕНИЯ ИЛИ ИЗМЕНЕНИЯ.</P>
<P>Вышеизложенное является BSD лицензией, классической лицензией
программного обеспечения с открытым кодом. Эта лицензия не накладывает
ограничений на использование исходного кода. Нам нравится эта лицензия
и мы не собираемся её менять.</P>
<H4><A name="1.3">1.3</A>) На каких Unix платформах работает PostgreSQL?</H4>
<P>Обычно, PostgreSQL может работать на любой современной платформе
совместимой с Unix. В инструкции по установке, вы найдете список
тех платформ, на которых были проведены тестовые запуски PostgreSQL
к моменту выхода данной версии.</P>
<H4><A name="1.4">1.4</A>) Существуют ли версии перенесенные не на Unix
системы?</H4>
<P>Начиная с версии 8.0, PostgreSQL без всяких ухищрений работает на
операционных системах Microsoft Windows, основанных на NT, таких как
Win2000, WinXP и Win2003. Пакет инсталлятора доступен по адресу
<A href="http://pgfoundry.org/projects/pginstaller">
http://pgfoundry.org/projects/pginstaller</A>.</P>
<P>Также существует версия спортированная под Novell Netware 6 на
<a href="http://forge.novell.com/">http://forge.novell.com</a>.</P>
<H4><A name="1.5">1.5</A>) Где можно взять PostgreSQL?</H4>
<P>Например, воспользовавшись анонимным доступом на ftp сайт
PostgreSQL <A href=
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>.
Список зеркал вы найдете на нашем основном сайте.</P>
<H4><A name="1.6">1.6</A>) Где получить поддержку?</H4>
<P>Основной список рассылки: <A href=
"mailto:pgsql-general@PostgreSQL.org">pgsql-general@PostgreSQL.org</A>.
В нем можно обсуждать любые темы, касающиеся PostgreSQL. Чтобы
подписаться, отправьте письмо по электронной почте, в котором в
теле письма (не в теме) напишите следующие строки:</P>
<PRE>
subscribe
end
</PRE>
<P>на адрес <A href=
"mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org</A>.</P>
<P>Существует дайжест список. Чтобы подписаться на него, отправьте
письмо по электронной почте на адрес: <A href=
"mailto:pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org</A>
и в теле письма напишите строчки строчки:</P>
<PRE>
subscribe
end
</PRE>
Дайжесты отправляются подписчикам, когда в основном списке рассылки
накопится около 30 килобайт сообщений.
<P>Доступен и список рассылки сообщений об ошибках. Чтобы подписаться на этот
список, отправьте по электронной почте письмо на адрес <A href=
"mailto:pgsql-bugs-request@PostgreSQL.org">pgsql-bugs-request@PostgreSQL.org</A>
и в теле письма напишите строчки строчки:</P>
<PRE>
subscribe
end
</PRE>
Также имеется список рассылки с дискуссиями разработчиков. Чтобы подписаться
на этот список, отправьте по электронной почте письмо на адрес
<A href=
"mailto:pgsql-hackers-request@PostgreSQL.org">pgsql-hackers-request@PostgreSQL.org</A>
и в теле письма напишите строчки строчки:
<PRE>
subscribe
end
</PRE>
<P>Дополнительные списки рассылки и инфомацию о PostgreSQL можно найти
на домашней страничке PostgreSQL по адресу:</P>
<BLOCKQUOTE>
<A href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</A>
</BLOCKQUOTE>
<P>Еще существует IRC канал на Freenode и EFNet, с названием
<I>#PostgreSQL</I>. Я использую для подключения к этому каналу команду Unix
<CODE>irc -c '#PostgreSQL' "$USER" irc.phoenix.net.</CODE> или
<CODE>irc -c '#PostgreSQL' "$USER" irc.freenode.net.</CODE></P>
<P>Список коммерческой поддержки компаний доступен на
<A href="http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php</A>.</P>
<H4><A name="1.7">1.7</A>) Какая последняя версия?</H4>
<P>Последний выпуск PostgreSQL - это версия 7.4.5</P>
<P>Мы планируем выпускать новые версии каждые 6-8 месяцев.</P>
<H4><A name="1.8">1.8</A>) Какая документация имеется в наличии?</H4>
<P>В дистрибутив включаются различные руководства, страницы
электронного руководства man и некоторые маленькие тестовые примеры.
Смотрите в каталог <I>/doc</I>. Вы также можете просматривать
документацию в Интернет по адресу
<A href="http://www.postgresql.org/docs">http://www.PostgreSQL.org/docs</A>.</P>
<P>Существует две книги по PostgreSQL доступные по адресам <A href=
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
и <a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>.
Список книг по PostgreSQL, которые можно купить доступен по адресу
<a href="http://techdocs.postgresql.org/techdocs/bookreviews.php">http://techdocs.postgresql.org/techdocs/bookreviews.php</a>.
Кроме того, по адресу <a href="http://techdocs.postgresql.org">http://techdocs.PostgreSQL.org/</a>
вы можете найти коллекцию технических статей посвященных PostgreSQL.</p>
<P><I>psql</I> имеет несколько прекрасных команд \d для отображения
информации по типам, операторам, функциям, агрегатам и т.д.</P>
<P>Наш сайт содержит еще больше информации.</P>
<H4><A name="1.9">1.9</A>) Как найти информацию об известных ошибках
или отсутствующих возможностях?</H4>
<P>PostgreSQL поддерживает расширенный подкласс <SMALL>SQL</SMALL>-92.
Смотрите наш список <A href="http://developer.postgresql.org/todo.php">TODO</A>
на предмет известных ошибок, отсутствующих возможностей и будущих
планов.</P>
<H4><A name="1.10">1.10</A>) Как мне научиться <SMALL>SQL</SMALL>?</H4>
<P>Книга по PostgreSQL на <A href=
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
научит <SMALL>SQL</SMALL>. Существует другая книга по PostgreSQL на
<A href="http://www.commandprompt.com/ppbook/">
http://www.commandprompt.com/ppbook.</A>
Есть прекрасный учебник на <A href=
"http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,</A>
на <A href=
"http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,</A>
и на <A href=
"http://sqlcourse.com/">http://sqlcourse.com.</A></P>
<P>Еще один учебник - это книга "Teach Yourself SQL in 21 Days, Second Edition"
(Освой самостоятельно SQL за 21 день, Вторая редакция)
на <A href=
"http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</A></P>
<P>Многим из наших пользователей нравится книга
<I>The Practical SQL Handbook</I>,
Bowman, Judith S., et al., Addison-Wesley. Другим нравится <I>The
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
<H4><A name="1.11">1.11</A>) Решена ли в PostgreSQL проблема 2000-го года (Y2K)?</H4>
<P>Да, мы легко работаем с датами после 2000 года и перед 2000 годом.</P>
<H4><A name="1.12">1.12</A>) Как присоединится к команде разработчиков?</H4>
<P>Для начала, скачайте последнюю версию исходных текстов и прочтите
документацию разработчиков PostgreSQL на нашем сайте или в дистрибутиве.
Затем, подпишитесь на списки рассылки <I>pgsql-hackers</I> и
<I>pgsql-patches</I>. Далее, отправляйте исправления (patches) высокого
качества в список pgsql-patches.</P>
<P>Существует ограниченный список людей, который имеют привелегию
вносить изменения в <SMALL>CVS</SMALL> архив PostgreSQL. Каждый
из этих людей в свое время отправил так много высококачественных исправлений,
что их было невозможно оставить без внимания и они были удостоены
превилегии вносить изменения, и мы уверены, что те исправления, которые
они внесут будут высокого качества.</P>
<H4><A name="1.13">1.13</A>) Как отправить сообщение об ошибке??</H4>
<P>Пожалуйста посетите страничку PostgreSQL BugTool на <A href=
"http://www.postgresql.org/bugs/bugs.php">http://www.PostgreSQL.org/bugs/bugs.php</A>,
на которой предоставлены детальные инструкции о том как отправить
сообщение об ошибке.</P>
<P>Также не забудьте посмотреть на <A href=
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>
на предмет более свежих версий PostgreSQL или заплат.</P>
<H4><A name="1.14">1.14</A>) Как сравнивать PostgreSQL с другими
<SMALL>СУБД</SMALL>?</H4>
<P>
Существует несколько методов сравнения программного обеспечения:
возможности, производительность, надежность, поддержка и цена.</P>
<DL>
<DT><B>Возможности</B></DT>
<DD>PostgreSQL имеет большинство возможностей представленных
в больших коммерческих <SMALL>СУБД</SMALL>, такие как: транзакции,
подзапросы, триггеры, представления, ссылочной
целостности вторичного ключа и разные блокировки. У нас есть некоторые возможности,
которых нет у них: типы, определяемые пользователем, механизм
наследования, правила и конкуретное многоверсионное управление
для работы с содержимым блокировок.<BR>
<BR>
</DD>
<DT><B>Производительность</B></DT>
<DD>PostgreSQL имеет производительность схожую с другими коммерческими
СУБД и с СУБД с открытым исходным кодом, в каких-то аспектах работая
быстрее чем они, в каких-то медленее. В сравнении с MySQL или обыденнее
СУБД, мы быстрее, когда пользователей много, а также на комплексных
запросах и чтении/записи загрузки запроса. MySQL быстрее для простых
SELECT запросов, выполняемых небольшим количеством пользователей.
И разумеется, MySQL не имеет каких-либо возможностей из
перечисленых выше, в секции <I>Возможности</I>.
Мы делаем упор на надежность и расширенные возможности, но мы также
продолжаем увеличивать производительность с каждым выпуском. Существует
интересная страничка в Интернет, сравнивающая PostgreSQL и MySQL на
<A href="http://openacs.org/philosophy/why-not-mysql.html">
http://openacs.org/philosophy/why-not-mysql.html</A>. Также, MySQL -
это компания, которая распространяет свой продукт через открытые
исходные тексты и требует коммерческую лицензию на закрытое
программное обеспечение, а не сообщество разработчиков с открытыми
исходными текстами, как PostgreSQL.<BR>
<BR>
</DD>
<DT><B>Надежность</B></DT>
<DD>Мы понимали, что наша <SMALL>СУБД</SMALL> должна быть надежной
или она ничего не будет стоить. Мы стараемся выпускать хорошо проверенный,
стабильный код, который содержит минимум ошибок. Каждый выпуск
проходит стадию бета-тестирования по крайней мере в течении одного
месяца и наша история выпусков показывает что мы можем предоставлять
стабильные, монолитные выпуски, которые готовы к продуктивному
использованию. Мы верим, что мы производим проверку не хуже,
чем у других СУБД.<BR>
<BR>
</DD>
<DT><B>Поддержка</B></DT>
<DD>Наш список рассылки предоставляет возможможность общения с
большой группой разработчиков и пользователей, которые могут помочь решить
любые возникшие проблемы. В то же время, мы не гарантируем какие-либо
исправления, но и разработчики коммерческих <SMALL>СУБД</SMALL> не всегда
делают исправления. Прямой доступ к разработчикам, сообществу
пользователей, руководствам и исходным текстам часто делают поддержку
PostgreSQL превосходящей другие <SMALL>СУБД</SMALL>. Существует
коммерческая поддержка по результам возникших инцидентов, которая
доступна для тех кому она нужна. (Смотрите <A href="#1.6">Секцию 1.6</A>.)<BR>
<BR>
</DD>
<DT><B>Цена</B></DT>
<DD>Наш продукт бесплатен как для коммерческого так, и не для
коммерческого использования. Вы можете добавлять свой код в наш
продукт без ограничений, за исключением тех, что описываются в
нашей лицензии стиля BSD, которая приведена выше.<BR>
<BR>
</DD>
</DL>
<H4><A name="1.15">1.15</A>) Как оказать финансовую помощь
PostgreSQL?</H4>
<P>PostgreSQL имеет одноранговую инфраструктуру с того самого времени
как мы начали разработку в 1996 году. Мы должны благодарить за
это Марка Фурнье (Marc Fournier), который создал эту инфраструктуру и
управляет ей на протяжении этих лет.</P>
<P>Качественная инфраструктура очень важна для проектов с открытым
исходным кодом. Она предотвращает расколы, которые могут сильно
задержать поступательное движение проекта.</P>
<P>Разумеется, эта инфраструктура не является дешевой. Существует
некоторое количество ежемесячных и одноразовых расходов, которые
требуют денег. Если вы или ваша компания имеет деньги, которые
можно передать в помощь нашим усилиям, пожалуйста посетите страничку
<A href="https://store.pgsql.com/shopping/">
https://store.pgsql.com/shopping/</A>
и сделайте свой вклад.</P>
<P>Хотя на страничке говорится о PostgreSQL, Inc, пункт
"contributions" предназначен исключительно для поддержки проекта
PostgreSQL и не передается какой-либо конкретной компании.
Если хотите, то можете это проверить, написав письмо на контактный адрес.</P>
<HR>
<p>Если у вас есть истории по успешному применению PostgreSQL, пожалуйста,
присылайте их на наш сайт пропаганды <a href="http://advocacy.postgresql.org/">
http://advocacy.postgresql.org</a>.</p>
<H2 align="center">Вопросы пользователей по клиентской части</H2>
<H4><A name="2.1">2.1</A>) Существуют ли <SMALL>ODBC</SMALL> драйвера
для PostgreSQL?</H4>
<P>Существует два <SMALL>ODBC</SMALL> драйвера, PsqlODBC
и OpenLink <SMALL>ODBC</SMALL>.</P>
<P>Вы можете скачать PsqlODBC с <A href="http://gborg.postgresql.org/project/psqlodbc/projdisplay.php">
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php</A>.</P>
<P>OpenLink <SMALL>ODBC</SMALL> можно взять на <A href=
"http://www.openlinksw.com/">http://www.openlinksw.com</A>. Этот
драйвер работает с их стандартным клиентским программным обеспечением,
использующим <SMALL>ODBC</SMALL>, и таким образом, <SMALL>ODBC</SMALL>
драйверы для PostgreSQL доступны для каждой из поддерживаемых ими
платформ (Win, Mac, Unix, VMS).</P>
<P>Возможно они будут продавать свой продукт тем кому нужна коммерческая
поддержка, но бесплатная версия всегда будет доступна. Пожалуйста,
направляйте вопросы на адрес <A href=
"mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk</A>.</P>
<H4><A name="2.2">2.2</A>) Какие инструменты существуют для использования
PostgreSQL через Web?</H4>
<P>Прекрасное введение во взаимодействие баз данных и Web можно найти на:
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
<P>Для интеграции с Web, одним из превосходных инструментов является PHP.
Домашняя станичка <A href="http://www.php.net">http://www.php.net</A>.</P>
<P>Для комплексных решений, многие пользуются Perl интерфейсом и CGI.pm или mod_perl.</P>
<H4><A name="2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
пользователя?</H4>
<P>Да, существует несколько графических интерфейсов для PostgreSQL.
Это PgAccess (<A href="http://www.pgaccess.org/">http://www.pgaccess.org</A>),
PgAdmin III (<A href="http://www.pgadmin.org/">http://www.pgadmin.org</A>),
RHDB Admin (<A href="http://sources.redhat.com/rhdb/">http://sources.redhat.com/rhdb/</A>)
и Rekall (<A href="http://www.thekompany.com/products/rekall/">
http://www.thekompany.com/products/rekall/</A>, коммерческий). Также есть
PhpPgAdmin (<A href="http://phppgadmin.sourceforge.net/">
http://phppgadmin.sourceforge.net/</A>) - интерфейс к PostgreSQL, основанный
на Web.</P>
<H4><A name="2.4">2.4</A>) Какие языки могут взаимодействовать с PostgreSQL?</H4>
<P>Какие-либо интерфейсы для PostgreSQL существуют для большинства
популярных языков программирования. Посмотрите список модулей расширения
для тех языков программирования, которыми вы пользуетесь.</P>
<P>Следующие интерфейсы включаются в дистрибутив PostgreSQL:</P>
<UL>
<LI>C (libpq)</LI>
<LI>Embedded C (ecpg)</LI>
<LI>Java (jdbc)</LI>
<LI>Python (PyGreSQL)</LI>
<LI>TCL (libpgtcl)</LI>
</UL>
<P>Дополнительные интерфейсы доступны по адресу
<A href="http://gborg.postgresql.org/">http://gborg.PostgreSQL.org</a>
в секции <i>Drivers/Interfaces</i>.
</P>
<HR>
<H2 align="center">Вопросы администрирования</H2>
<H4><A name="3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
от <I>/usr/local/pgsql</I>?</H4>
<P>Задайте опцию <I>--prefix</I> когда запускаете <I>configure</I>.</P>
<H4><A name="3.2">3.2</A>) Когда я запускаю <I>postmaster</I>, я получаю
сообщение <I>Bad System Call</I> или сообщение core dumped. Почему?</H4>
<P>Это может быть вызвано разными проблемами, но первое, что
нужно сделать - это убедиться в том, что в вашем ядре установлено
расширение System V. PostgreSQL требует, чтобы ядро поддерживало
разделяемую память и семафоры.</P>
<H4><A name="3.3">3.3</A>) Когда я пытаюсь запустить <I>postmaster</I>, я
получаю ошибки <I>IpcMemoryCreate</I>. Почему?</H4>
<P>Либо у вас в ядре неправильные настройки разделяемой памяти, либо
вашему ядру нужно большее количество доступной разделяемой памяти.
Те конкретные действия, которые вам нужно произвести зависят от
архитектуры вашей машины и от того как много буферов и backend
процессов вы настроили для <I>postmaster</I>. Для большинства систем,
с количеством буферов и процессов по умолчанию, необходимый минимум -
это около 1 мегабайта. Подробности о разделяемой памяти и семафорах
смотрите в <A href=
"http://www.postgresql.org/docs/viev.php?version=current&amp;idoc=1&amp;file=kernel-resources.html">Руководстве
администратора PostgreSQL</A>.</P>
<H4><A name="3.4">3.4</A>) Когда я пытаюсь запустить <I>postmaster</I>, я
получаю ошибки <I>IpcSemaphoreCreate</I>. Почему?</H4>
<P>Если это сообщение <I>IpcSemaphoreCreate: semget failed (No
space left on device)</I> то настройки вашего ядра таковы, что ему не
хватает семафоров. Postgres требует один семафор на потенциальный
backend процесс. Временным решением является запуск <I>postmaster</I>
с настройками на мешьшее количество backend процессов. Используйте
<I>-N</I> с значением меньшим чем 32, которое принято по умолчанию.
Более правильное решение - это увеличить значения <SMALL>SEMMNS</SMALL>
и <SMALL>SEMMNI</SMALL> в настрйках ядра.</P>
<P>Неисправные семафоры также могут привести к падению СУБД во время
доступа к базе данных.</P>
<P>Если вы получили какое-либо другое сообщение об ошибке, то вполне
возможно, что в вашем ядре вообще не настроена поддержка семафоров.
Смотрите подробности о разделяемой памяти и семафорах в Руководстве
Администратора PostgreSQL.</P>
<H4><A name="3.5">3.5</A>) Как мне управлять соединениями с других
компьютеров?</H4>
<P>По умолчанию, PostgreSQL разрешает только соединения на локальной
машине через сокеты домена Unix или TCP/IP соединения. Другие машины
не смогут подключиться к базе пока вы не измените listen_addresses в
postgresql.conf <B>и</B> пока не будет разрешена host-авторизация в файле
<I>$PGDATA/pg_hba.conf</I>.</P>
<H4><A name="3.6">3.6</A>) Какие настройки мне нужно сделать для улучшения
производительности?</H4>
<P>Несомненно, индексы могут увеличить скорость выполнения запросов. Команда
<SMALL>EXPLAIN ANALYZE</SMALL> позволяет вам посмотреть как PostgreSQL
интерпретирует ваш запрос и какие индексы используются.</P>
<P>Если вы выполняете много операторов <SMALL>INSERT</SMALL>,
рассмотрите возможность выполнять их в большой пачке, используя
команду <SMALL>COPY</SMALL>. Это значительно быстрее, чем отдельные
<SMALL>INSERT</SMALL>. Во-вторых, операторы вне блока транзакции
<SMALL>BEGIN WORK/COMMIT</SMALL> сами выполняют транзакцию. Подумайте
над выполнением нескольких операторов в одном блоке транзакции.
Это уменьшит количество транзакций. Также, задумайтесь над удалением
и пересозданием индексов, когда вы выполняете большие изменения
данных.</P>
<P>Существует несколько опций настройки. Вы можете запретить
<I>fsync()</I> при старте <I>postmaster</I> с опцией <I>-o -F</I>.
Это предотвратит вызовы <I>fsync()</I>, которые приводят к сбросу
данных на диск после каждой транзакции.</P>
<P>Вы можете также использовать для <I>postmaster</I> опцию <I>-B</I>
для увеличения количества буферов разделяемой памяти, которая
используется backend процессами. Если вы сделаете значение этого параметра
слишком большим, то <I>postmaster</I> может не запустится потому что
вы исчерпаете ограничение ядра на объем разделяемой памяти. Каждый
буфер имеет размер в 8 килобайт и по умолчанию выделяется 64 буфера.</P>
<P>Вы можете также использовать backend опцию <I>-S</I> для увеличения
максимального количества памяти, которое используется backend процессом
для временных сортировок. Значение для опции <I>-S</I> задается в
килобайтах и по умолчанию равно 512 (т.е. 512K).</P>
<P>Вы также можете использовать команду <SMALL>CLUSTER</SMALL> для
группировки данных в таблицах на совпадающий индекс. Подробности смотрите
на странице руководства по команде <SMALL>CLUSTER</SMALL>.</P>
<H4><A name="3.7">3.7</A>) Какие возможности для отладки есть в
наличии?</H4>
<P>PostgreSQL имеет несколько возможностей, позволяющие получить
информацию о состоянии, которая может быть использована в отладочных
целях.</P>
<P>Во-первых, при запуске <I>configure</I> с опцией --enable-cassert,
многие вызовы <I>assert()</I> позволяют отслеживать работу backend
процесса и остановку программы при возникновении каких-либо
неожиданностей.</P>
<P>И <I>postmaster</I>, и <I>postgres</I> имеют несколько отладочных
опций. Во-первых, при запуске <I>postmaster</I>, убедитесь, что
стандартный вывод и вывод ошибок осуществляются в файл журнала:</P>
<PRE>
cd /usr/local/pgsql
./bin/postmaster &gt;server.log 2&gt;&amp;1 &amp;
</PRE>
<P>Это приведет к появлению файла server.log в главном каталоге
PostgreSQL. Этот файл содержит полезную информацию о проблемах или
ошибках, возникших на сервере. <I>Postmaster</I> имеет опцию <I>-d</I>,
которая позволяет получать при протоколировании более детальную
инфрмацию. Для опции <I>-d</I> указывается число, которое задает уровень
отладки. Будьте осторожны, так как высокий уровень отладки приводит
к генерации файлов журнала большого размера.</P>
<P>Если <I>postmaster</I> не запущен, вы можете запустить
<I>postgres</I> backend из командной строки и ввести ваш оператор
<SMALL>SQL</SMALL> напрямую. Это рекомендуется <B>только</B> для
целей отладки. Заметим, что в этом режиме, запрос завершается символом
новой строки, а не точкой с запятой. Если вы производили компиляцию
с отладочными символоами, вы можете использовать любой отладчик, чтобы
посмотреть, что случилось. Поскольку backend запускается не из
<I>postmaster</I>, он не запускается в идентичном окружении и значит
проблемы итераций блокировок/backend не могут быть воспроизведены.</P>
<P>Если <I>postmaster</I> запущен, запустите <I>psql</I> в одном
окне, затем найдите <SMALL>PID</SMALL> процесса <I>postgres</I>,
используемый <I>psql</I>. Используйте отдадчик для подключения к
<I>postgres</I> <SMALL>PID</SMALL>. Вы можете установить точки
прерывания в отладчике и запустить запрос из <I>psql</I>. Если
вы производите отладку запуска <I>postgres</I>, вы можете установить
PGOPTIONS="-W n", и затем запустить <I>psql</I>. Эта опция приводит
к задержке процесса запуска на <I>n</I> секунд, в течение которых
вы можете подключить к процессу отладчик, установить любые точки
прерывания и продолжить запуск.</P>
<P>Программа <I>postgres</I> имеет опции <I>-s, -A</I>, и <I>-t</I>
которые могут быть очень полезными для отладки и измерения
производительности.</P>
<P>Вы также можете скомпилировать PostgreSQL с профилированием для
того, чтобы увидеть какие функции сколько времени выполняются.
Файлы профилирования backend'а находятся в каталоге
<I>pgsql/data/base/dbname</I>. Файл профилирования клиента
будет помещен в текущий каталог клиента. В Linux для выполнения
профилирования требуется компиляции с <I>-DLINUX_PROFILE</I>.</P>
<H4><A name="3.8">3.8</A>) Почему я получаю сообщение <I>"Sorry, too
many clients"</I> когда пытаюсь подключиться к базе?</H4>
<P>Вам нужно увеличить ограничение на количество конкуретных
backend процессов при запуске <I>postmaster</I>.</P>
<P>По умолчанию установлен лимит на 32 процесса. Вы можете
увеличить этот лимит перезапустив <I>postmaster</I> с нужным
значением процессов, которое указывается в опции <I>-N</I> или
изменив файл <I>postgresql.conf</I>.</P>
<P>Заметим, что если вы зададите в опции <I>-N</I> значение больше
32, то вы также должны увеличить значение в опции <I>-B</I> которое
по умолчанию установлено в 64; Значение опции <I>-B</I> должно быть
по крайней мере вдвое больше значения опции <I>-N</I>, и возможно
ещё больше для лучшей производительности. Для большего количества
backend процессов, вам также неплохо было бы увеличить некоторые
параметры ядра Unix. Это такие параметры, как максимальное количество
блоков разделяемой памяти, <SMALL>SHMMAX;</SMALL> максимальное количество
семафоров, <SMALL>SEMMNS</SMALL> и <SMALL>SEMMNI;</SMALL> максимальное
количество процессов, <SMALL>NPROC;</SMALL> максимальное количество
процессов на пользователя, <SMALL>MAXUPRC;</SMALL> и максимальное
количество открытых файлов, <SMALL>NFILE</SMALL> и <SMALL>NINODE</SMALL>.
Причина создания ограничения на количество backend процессов как
раз и состоит в том, чтобы вашей системе хватило ресурсов.</P>
<H4><A name="3.9">3.9</A>) Что находится в каталоге <I>pgsql_tmp</I>?</H4>
<P>Данный каталог содержит временные файлы, генерируемые обработчиком
запроса. Например, если для выполнения <small>ORDER BY</small> нужна
сортировка и эта сортировка требует памяти больше, чем допускает параметр <i>-S</i>
у backend'а, то для хранения дополнительных данных создаются временные
файлы.</P>
<P>Эти временные файлы должны удаляться автоматически, но этого может не
произойти, если backend рухнул во время сортировки. Останов и запуск
серверного процесса обеспечит их удаление из каталога.</P>
<H4><A name="3.10">3.10</A>) Почему необходимо делать dump и restore при
обновлении выпусков PostgreSQL?</H4>
<P>Разработчики PostgreSQL делают только небольшие изменения между
подвыпусками. Таким образом обновление с версии 7.2 до 7.2.1 не требует
выполнения dump и restore. Однако при выходе очередного выпуска
(т.е. при обновлении например, с 7.2 на 7.3) часто меняется внутренний
формат системных таблиц и файлов данных. Эти изменения часто носят
комплексный характер, так что нет возможности обеспечить обратную
совместимость файлов данных. Выполение dump позволяет получить данные
в общем формате, который затем может быть загружен при использовании
нового внутреннего формата.</P>
<P>В тех выпусках, где формат данных на диске не меняется, для проведения
обновления может быть использован сценарий <i>pg_upgrade</i> без
использования dump/restore. Комментарии к выпуску говорит когда можно
использовать <i>pg_upgrade</i> для этого выпуска.</P>
<H4><A name="3.11">3.11</A>) Какое компьютерное "железо" я должен
использовать?</H4>
<P>Поскольку "железо" персональных компьютеров является наиболее
совместимым, люди склонны верить, что такое "железо" имеет одинаковое
качество. Это не так. Память ECC, SCSI и качественные материнские платы
являются более надёжными и имеют более лучшую производительность, чем
менее дорогое "железо". PostgreSQL будет работать на любом "железе",
но если для вас важны надёжность и производительность, то с вашей стороны
будет мудро поставить соответствующее "железо". Обсудить разное "железо"
можно в наших списках рассылки.</P>
<HR>
<H2 align="center">Вопросы эксплуатации</H2>
<H4><A name="4.1">4.1</A>) В чем отличие между бинарным и нормальным
курсором?</H4>
<P>Смотрите описание на страницах руководства посвященным
<SMALL>DECLARE</SMALL>.</P>
<H4><A name="4.2">4.2</A>) Как выполнить <SMALL>SELECT</SMALL> только
для нескольких первых строчек запроса? Произвольной строки?</H4>
<P>Смотрите станицу руководства посвященную <SMALL>FETCH</SMALL>
или используйте <SMALL>SELECT</SMALL> ... <SMALL>LIMIT</SMALL>....</P>
<P>Даже если вы хотите получить только первые несколько записей,
будет выполнен весь запрос. Рассмотрим запрос, который имеет
<SMALL>ORDER BY.</SMALL> Если есть какой-либо индекс, который
совпадает с <SMALL>ORDER BY</SMALL>, PostgreSQL может
выдать только несколько первых запрошенных записей или может
выполнять запрос пока не будут выданы желаемые записи.</P>
<p>To <small>SELECT</small> a random row, use:
</p><pre> SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</pre>
</p>
<H4><A name="4.3">4.3</A>) Как получить список таблиц или других
компонентов в <I>psql</I>?</H4>
<P>Чтобы просматривать таблицы в <I>psql</I>, используйте команду \dt.
Полный список команд в <I>psql</I> вы можете получить, используя \?.
Кроме того, вы можете посмотреть исходный код <I>psql</I> в файле
<I>pgsql/src/bin/psql/describe.c</I>. Он содержит команды
<SMALL>SQL</SMALL> которые генерируются при вводе в <I>psql</I> команд,
начинающихся с обратной косой черты. Вы также можете запустить
<I>psql</I> с опцией <I>-E</I> так, чтобы эта программа выдавала
запросы, которые она использует для выполнения заданных вами
команд. PostgreSQL также предоставляет <SMALL>SQLi</SMALL>
совместимый с INFORMATION SCHEMA интерфейс, с помощью которого, вы
можете сформировать запрос на получение информации о базе данных.</P>
<H4><A name="4.4">4.4</A>) Как удалить колонку из таблицы или
изменить её тип данных?</H4>
<P><small>DROP COLUMN</small> функциональность была добавлена в выпуск
7.3 с оператором <small>ALTER TABLE DROP COLUMN</small>. В ранних версиях,
можно сделать так:</P>
<PRE>
BEGIN;
LOCK TABLE old_table;
SELECT ... -- выборка всех колонок за исключением той, которую хотите удалить
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
</PRE>
<P>Для изменения типа данных колонки, сделайте так:</P>
<PRE>
BEGIN;
ALTER TABLE tab ADD COLUMN new_col <i>new_data_type</i>;
UPDATE tab SET new_col = CAST(old_col AS <i>new_data_type</i>);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
</PRE>
<H4><A name="4.5">4.5</A>) Каковы максимальные размеры для записей,
таблиц и базы данных?</H4>
<P>Существуют следующие ограничения:</P>
<PRE>
Максимальный размер базы? неограничен (существуют базы на 32 TB)
Максимальный размер таблицы? 32 TB
Максимальный размер записи? 1.6 TB
Максимальный размер поля? 1 GB
Максимальное количество записей в таблице? неограничено
Максимальное количество колонок в таблице? 250-1600 в зависимости от типа
Максимальное количество индексов в таблице? неограничено
</PRE>
Разумеется, понятие "неограничено" на самом деле ограничивается
доступным дисковым пространиством и размерами памяти/своппинга.
Когда значения перечисленные выше неоправдано большие, может
пострадать производительность.
<P>Максимальный размер таблицы в 32 TB не требует чтобы операционная
система поддерживала файлы больших размеров. Большие таблицы хранятся
как множество файлов размером в 1 GB, так что ограничения, которые
накладывает файловая система не важны.</P>
<P>Максимальный размер таблицы и максимальное количество колонок
могут быть увеличены в четыре раза, если размер блока по умолчанию будет
увеличен до 32k.</P>
<H4><A name="4.6">4.6</A>) Как много дискового пространства в базе данных
нужно для сохранения данных из обычного текстового файла?</H4>
<P>СУБД PostgreSQL может потребоваться дискового пространства до 5 раз
больше для сохранения данных из простого текстового файла.</P>
<P>В качестве примера, рассмотрим файл в 100,000 строк в каждой, из
которых целое число и текстовое описание. При этом длина текста,
в среднем, составляет 20 байт. Размер простого файла составит 2.8 MB.
Размер базы PostgreSQL, содержащей эти же данные составит приблизительно
6.4 MB из которых:</P>
<PRE>
32 байт: на каждый заголовок записи (приблизительно)
+ 24 байта: одно поле с целочисленным типом и одно текстовое поле
+ 4 байта: указатель на странице для всей записи
----------------------------------------
60 байт на запись
Размер страницы данных в PostgreSQL составляет 8192 байт (8 KB), так что:
8192 байт на страницу
--------------------- = 136 записей на страницу БД (округлённо)
60 байт на запись
100000 строк данных
----------------------- = 735 страниц в БД (округлённо)
128 записей на страницу
735 страниц БД * 8192 байт на страницу = 6,021,120 байт (6 MB)
</PRE>
<P>Индексы не требуют так много, но поскольку они создаются для
большого количества данных, они также могут быть велики.</P>
<P>Значения <small>NULL</small> хранятся как битовые карты и поэтому они
занимают очень мало места.
</P>
<H4><A name="4.7">4.7</A>) Как мне убедиться, что существуют нужные мне
таблицы, индексы, базы данных и пользователи?</H4>
<P><I>psql</I> имеет несколько команд, начинающихся с обратной косой
черты, для того чтобы просматривать такую информацию. Используйте
\? для того, чтобы увидеть эти команды. Также существуют системные
таблицы, имя которых начинается на <i>pg_</i> и в которых также содержится
эта информация. Ещё, <i>psql -l</i> покажет список всех баз данных.</P>
<P>Также смотрите файл <I>pgsql/src/tutorial/syscat.source</I>. В нем
представлены многие операторы <SMALL>SELECT</SMALL> которые нужны
для получения информации из системных таблиц базы данных.</P>
<H4><A name="4.8">4.8</A>) У меня медленно работают запросы или не
происходит использования индексов. Почему?</H4>
<P>Индексы не используются для каждого запроса автоматически. Они
используются только если таблица больше минимального размера и запрос
выбирает только маленький процент записей в таблице. Так устроено,
потому что доступ к диску с применением рандомизации при сканировании
индексов может быть медленнее, чем простое чтение таблицы или ее
последовательное сканирование.</P>
<P>Чтобы определить необходимость использования индекса для какой-либо
таблицы, PostgreSQL должен иметь статистику по этой таблице. Эта
статистика собирается при использовании <SMALL>VACUUM ANALYZE</SMALL>
или просто <SMALL>ANALYZE</SMALL>. Используя статистику, оптимизатор
узнает о том как много записей в таблице и если он должен использовать
индексы, то он может принимать лучшие решения. Статистика также
влияет на определение оптимального порядка связывания и метода связывания.
Сбор статистики должен периодически выполнятся при изменении содержимого
таблицы.</P>
<P>Обычно индексы не используются для <SMALL>ORDER BY</SMALL> или для
выполнения связываний. Последовательный перебор следующий за явной
сортировкой обычно быстрее, чем поиск по индексам в большой таблице.
Однако, <SMALL>ORDER BY</SMALL> часто комбинируется с <SMALL>LIMIT</SMALL>
и в этом случае индекс будет использоваться, поскольку при выполнении
будет возвращаться небольшая часть таблицы. Фактически MAX() и MIN() не
используют индексы, но индекс используется при построении запросов с
<SMALL>ORDER BY</SMALL> и <SMALL>LIMIT</SMALL>:
<pre>
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
</pre>
<P>Если вам кажется, что оптимизатор некорректно выбирает последовательный
перебор, используйте <CODE>SET enable_seqscan TO 'off'</CODE> и
запустите тесты, чтобы увидеть, не стало-ли сканирование индексов быстрее.
</P>
<P>Когда используются операции с шаблонами, например <SMALL>LIKE</SMALL>
или <I>~</I>, индексы могут быть использованы в следующих случаях:</P>
<UL>
<LI>Начало строки поиска должно совпадать с началом искомой строки, т.е.:
<UL>
<LI><small>LIKE</small> шаблоны не должны начинаться с <i>%.</i>.</LI>
<LI><i>~</i> шаблоны регулярных выражений должна начинаться на <i>^</i>.</LI>
</UL></LI>
<LI>Строка поиска не должна начинаться с символа класса, т.е. [a-e].</LI>
<LI>Поиск независимый от регистра, такой как <small>ILIKE</small> и
<i>~*</i> не использует индексы. Вместо него, используйте функциональные
индексы, которые описываются в секции <A href="#4.12">4.12</A>.</LI>
<LI>Во время <i>initdb</i> должна использоваться локаль по умолчанию
<i>C</i>.
</UL>
</P>
<P>В выпусках до версии 8.0, индексы часто нельзя было использовать,
если типы данных точно не совпадали с индексными типами колонок. Это
особенно касалось int2, int8 и numeric индексов колонок.</P>
<H4><A name="4.9">4.9</A>) Как посмотреть на то, как оптимизатор выполняет
мой запрос?</H4>
<P>Смотрите страницу руководства посвященную <SMALL>EXPLAIN</SMALL>.</P>
<H4><A name="4.10">4.10</A>) Что такое R-tree индекс?</H4>
<P>R-tree индекс используется для индексирования пространственных данных.
Индекс хэша не может управлять поисками диапазона. B-tree индекс
управляет только поисками диапазона в одном измерении. R-tree индекс
может управлять многоразмерными данными. Например, если R-tree индекс
может быть встроен в атрибут типа <I>point</I>, то система может
более эффективно ответить на запрос типа "выбрать все точки внутри
заданного четырехугольника."</P>
<P>Канонический источник, описывающий первоначальное создание R-tree
это:</P>
<P>Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt
of Data, 45-57.</P>
<P>Вы можете найти этот документ в книге Стоунбрейкера "Readings in
Database Systems".</P>
<P>Встроеннные R-tree могут управлять полигонами и боксами. В теории,
R-tree могут быть расширены для управления большим количеством
измерений. На практике, расширение R-tree требует некоторых усилий и
у нас, в данный момент, нет какой-либо документации о том, как это
сделать.</P>
<H4><A name="4.11">4.11</A>) Что такое Genetic Query
Optimizer?</H4>
<P>Модуль <SMALL>GEQO</SMALL> производит быструю оптимизацию запроса,
когда происходит связывание многих таблиц через Genetic Algorithm (GA).
Это позволяет управлять большими запросами на связывание через
неистощающий поиск.</P>
<H4><A name="4.12">4.12</A>) Как мне выполнить поиск регулярного выражения
и поиск независимый от регистра букв поиск регулярного выражения?
Как мне использовать индекс для поиска независимого от регистра букв?</H4>
<P>Оператор <I>~</I> производит поиск регулярного выражения, а оператор
<I>~*</I> производит независимый от регистра букв поиск регулярного
выражения. Независимый от регистра вариант <SMALL>LIKE</SMALL> называется
<SMALL>ILIKE</SMALL>.</P>
<P>Независимое от регистра сравнение обычно выражается так:</P>
<PRE>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</PRE>
Эта конструкция не будет использовать стандартный индекс. Однако, если
вы создадите функциональный индекс, он будет использован:
<PRE>
CREATE INDEX tabindex ON tab (lower(col));
</PRE>
<H4><A name="4.13">4.13</A>) Как я могу определить, что значение поля
равно <SMALL>NULL</SMALL> в каком-либо запросе?</H4>
<P>Вы просто сравниваете значение с <SMALL>IS NULL</SMALL> и
<SMALL>IS NOT NULL</SMALL>.</P>
<H4><A name="4.14">4.14</A>) Каковы отличия между разными символьными
типами?</H4>
<PRE>
Тип Внутреннее имя Замечания
--------------------------------------------------
VARCHAR(n) varchar размер задает максимальную длину, нет заполнения
CHAR(n) bpchar заполняется пустотой до фиксированной длины
TEXT text нет задаваемого верхнего ограничения или длины
BYTEA bytea массив байт переменной длины (можно использовать null-байт без опаски)
"char" char один символ
</PRE>
<P>Внутреннее имя вы можете увидеть, когда смотрите системные каталоги
и в некоторых сообщениях об ошибках.</P>
<P>Первые четыре типа являются "varlena" типами (т.е., первые
четыре байта на диске являются длинной, за которой следуют данные).
Таким образом, фактически используемое пространство больше, чем
обозначенный размер. Однако, эти типы данных также поддаются сжатию
или могут быть сохранены не в строком виде через <SMALL>TOAST</SMALL>,
так что занимаемое дисковое пространство может также быть и меньше,
чем ожидалось.</P>
<SMALL>VARCHAR(n)</SMALL> - это лучшее решение, когда нужно хранить
строки переменной длины, не превышающие определенного размера.
<SMALL>TEXT</SMALL> - это лучшее решение для строк неограниченной длины,
с максимально допустимой длиной в 1 гигабайт.
<P><SMALL>CHAR(n)</SMALL> - это лучшее решение для хранения строк, которые
обычно имеют одинаковую длину. <SMALL>CHAR(n)</SMALL> заполняется
пустотой до заданной длины, в то время как <SMALL>VARCHAR(n)</SMALL>
хранит только символы, из которых состоит строка.
<SMALL>BYTEA</SMALL> используется для хранения бинарных данных, значения
которых могут включать <SMALL>NULL</SMALL> байты. Все типы описанные
здесь, имеют сходные характеристики производительности.</P>
<H4><A name="4.15.1">4.15.1</A>) Как мне создать поле
serial/с-авто-увеличением?</H4>
<P>PostgreSQL поддерживает тип данных <SMALL>SERIAL</SMALL>. Он
автоматически создает последовательность. Например:</P>
<PRE>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</PRE>
автоматически транслируется в:
<PRE>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</PRE>
Смотрите подробности о последовательностях на странице руководства
посвященной <I>create_sequence</I>. Вы также можете использовать
каждое поле <I>OID</I> в записи как уникальное значение. Однако,
если вам нужен дамп и перезагрузка базы данных, вам необходимо
использовать команду <I>pg_dump</I> с опцией <I>-o</I> или опцию
<SMALL>COPY WITH OIDS</SMALL> для сохранения значений поля
<SMALL>OID</SMALL>.
<H4><A name="4.15.2">4.15.2</A>) Как мне получить значение при вставке
<SMALL>SERIAL</SMALL>?</H4>
<P>Один из способов состоит в получении следующего значения
<SMALL>SERIAL</SMALL> из объекта sequence с помощью функции
<I>nextval()</I> <I>перед</I> вставкой и затем вставлять это значение
явно. Используйте таблицу-пример в <A href="#4.15.1">4.15.1</A>, пример
в псевдоязыке покажет как это делается:</P>
<PRE>
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
</PRE>
Затем вы должны также сохранить новое значение в переменной
<CODE>new_id</CODE> для его использования в других запросах (например
таких как внешний ключ для таблицы <CODE>person</CODE>). Заметим,
что имя автоматически созданного объекта <SMALL>SEQUENCE</SMALL>
будет &lt;<I>table</I>&gt;_&lt;<I>serialcolumn</I>&gt;_<I>seq</I>,
где <I>table</I> и <I>serialcolumn</I> являются соответственно
именами вашей таблицы и вашей колонки <SMALL>SERIAL</SMALL>.
<P>В качестве альтернативы, вы можете получить назначенное значение
<SMALL>SERIAL</SMALL> с помощью функции <I>currval()</I>
<I>после</I> проведения обычной операции вставки, например</P>
<PRE>
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
</PRE>
И наконец, вы можете использовать значение
<A href="#4.16"><SMALL>OID</SMALL></A>, возращаемое из опертора
<SMALL>INSERT</SMALL> чтобы увидеть значение по умолчанию, что
предположительно является наименее переносимым на другие платформы
решением, к тому же значение oid будет урезаться, когда оно достигнет
4 миллиардов. В Perl, используя DBI с модулем Edmund Mergl'я DBD::Pg,
значение oid становится доступным через <I>$sth-&gt;{pg_oid_status}</I>
после <I>$sth-&gt;execute()</I>.
<H4><A name="4.15.3">4.15.3</A>) Не может ли получиться так, что
использование <I>currval()</I> и <I>nextval()</I> приведет к
зациклированию с другими пользователями?</H4>
<P>Нет. <i>currval()</i> возвращает текущее значение, назначенное вашем
backend'ом, а не другими пользователями.</P>
<H4><A name="4.15.4">4.15.4</A>) Почему числа из моей последовательности
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?</H4>
<P>Для реализации конкуретности, значения последовательностей, при
необходимости выдаются во время запуска транзакций и не блокируются
до полного выполнения транзакций. Это может вызывать разрывы в
нумерации при отмене транзакций.</P>
<H4><A name="4.16">4.16</A>) Что такое <SMALL>OID</SMALL>? Что такое
<SMALL>TID</SMALL>?</H4>
<P>Поля <SMALL>OID</SMALL> служат уникальными идетификаторами записей
в PostgreSQL. Каждая запись, которая создаётся в PostgreSQL получает
уникальный <SMALL>OID</SMALL>. Все значения <SMALL>OID</SMALL>
генерируемые во время <I>initdb</I> имеют значения меньше 16384 (из
<I>include/access/transam.h</I>). Все созданные пользователем
<SMALL>OID</SMALL> имеют бОльшие значение. По умолчанию, все эти
<SMALL>OID</SMALL> являются уникальными не только внутри какой-либо
таблицы или базы данных, но и внутри всей СУБД PostgreSQL.</P>
<P>PostgreSQL использует <SMALL>OID</SMALL> в своих внутренних системных
таблицах для связи записей и таблиц. Значения <SMALL>OID</SMALL> могут
быть использованы для идентификации заданных пользователем записей,
а также использоваться при связываниях. Рекомендуется использовать
тип колонки <SMALL>OID</SMALL> для хранения значений <SMALL>OID</SMALL>
Вы можете создать индекс на поле <SMALL>OID</SMALL> для более быстрого
доступа.</P>
<P>Значения <SMALL>OID</SMALL> назначаются для всех новых записей из
центральной области, которые используются всеми всеми базами данных.
Если вы хотите изменить <SMALL>OID</SMALL> на какое-либо другое
значение или если вы хотите создать копию таблицы с такимиже
<SMALL>OID</SMALL>, то это можно сделать так:</P>
<PRE>
CREATE TABLE new_table(mycol int);
SELECT oid AS old_oid, mycol INTO tmp_table FROM old_table;
COPY tmp_table TO '/tmp/pgtable';
COPY new_table WITH OIDS FROM '/tmp/pgtable';
DROP TABLE tmp_table;
</PRE>
<P>O<SMALL>ID</SMALL> хранится как 4-х байтное целое и не может превышать
значение в 4 миллиарда. Однако, еще никто не сообщил о том, что такое
произошло, но мы планируем до того как это случиться избавится от
этого ограничения.</P>
<P>T<SMALL>ID</SMALL> используется для идентификации специальных
физических записей с блочными и offset значениями. T<SMALL>ID</SMALL>
изменяется после того как записи были изменены или перегружены.
<P>T<SMALL>ID</SMALL> используется индексными записями в качестве
указателя на физические записи.</P>
<H4><A name="4.17">4.17</A>) Что означают некоторые термины используемые в
PostgreSQL?</H4>
<P>Некоторый исходный код и старая документация используют
общеупотребительные термины. Вот некоторые из них:</P>
<UL>
<LI>table, relation, class</LI>
<LI>row, record, tuple</LI>
<LI>column, field, attribute</LI>
<LI>retrieve, select</LI>
<LI>replace, update</LI>
<LI>append, insert</LI>
<LI><SMALL>OID</SMALL>, serial value</LI>
<LI>portal, cursor</LI>
<LI>range variable, table name, table alias</LI>
</UL>
<P>Список общих терминов по базам данных можно найти на <A href="http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</A></P>
<H4><A name="4.18">4.18</A>) Почему я получаю ошибку <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?</H4>
<P>Предположительно у вас закончилась виртуальная память
или что ваше ядро имеет маленький лимит на определенные ресурсы.
Попытайтесь перед запуском <I>postmaster</I> выполнить следующие
команды:</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
В зависимости от командного интерпретатора shell, только одна из данных
команд выполнится успешно, но она позволит вам установить больший
сегмент данных процесса и возможно решит проблему. Эта команда
изменяет параметры текущего процесса и всех его потомков, созданных
после её запуска. Если у вас возникла проблема с <SMALL>SQL</SMALL>
клиентом, потому что backend возвращает слишком большой объем данных,
попытайтесь выполнить эту команду перед запуском клиента.
<H4><A name="4.19">4.19</A>) Как мне узнать, какая версия PostgreSQL
запущена?</H4>
<P>Из <I>psql</I>, наберите <CODE>SELECT version();</CODE></P>
<H4><A name="4.20">4.20</A>) Почему при работе с моим большим объектом
я получаю ошибку <I>"invalid large obj descriptor"</I>?</H4>
<P>Вам нужно при использовании большого объекта поместить в начале
<CODE>BEGIN WORK</CODE> и в конце <CODE>COMMIT</CODE>, а внутри
получившегося блока <CODE>lo_open</CODE> ... <CODE>lo_close.</CODE></P>
<P>В настоящий момент PostgreSQL требует, чтобы при закрытии большого
объекта происходило выполнение транзакции. Таким образом, первая же
попытка сделать что-либо с большим объектом, не соблюдая данного правила
приведет к сообщению <I>invalid large obj descriptor</I>, так как
код выполняющий работу над большим объектом (по крайней мере в
настоящий момент) будет генерировать сообщение об ошибке если вы не
используете транзакцию.</P>
<P>Если вы используете такой интерфейс клиента как <SMALL>ODBC</SMALL>,
вам возможно понадобится установить <CODE>auto-commit off.</CODE></P>
<H4><A name="4.21">4.21</A>) Как мне создать колонку которая по умолчанию
будет содержать текущее время?</H4>
<P>Используйте <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
<CODE>CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
</CODE>
</PRE>
<H4><A name="4.22">4.22</A>) Почему мои подзапросы, использующие
<CODE><SMALL>IN</SMALL></CODE> так медленно работаеют?</H4>
<P>В версиях до 7.4, подзапросы связывались с родительскими запросами
через последовательный перебор результатов позапроса для каждой
записи родительского запроса. Если подзапрос возвращает только несколько
записей, а родительский запрос возвращает много записей,
<CODE><SMALL>IN</SMALL></CODE> работает наиболее быстро. Чтобы
увеличить скорость в других запросах, замените <CODE>IN</CODE> на
<CODE>EXISTS</CODE>:</P>
<PRE>
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
</PRE>
на:
<PRE>
SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);
</PRE>
Чтобы такая конструкция работала быстро, колонка <CODE>subcol</CODE>
должна быть проиндексирована.
<P>В версии 7.4 и выше, <CODE>IN</CODE> фактически использует такой же
механизм связывания как и обычные запросы, поэтому предпочтительным
является использование <CODE>EXISTS</CODE></P>.
<H4><A name="4.23">4.23</A>) Как мне выполнить внешнее связывание?</H4>
<P>PostgreSQL поддерживает внешнее связывание,
используя стандартный синтаксис SQL. Вот два примера:</P>
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</PRE>
или
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</PRE>
<P>Это идентичные запросы связывания t1.col и t2.col, также возвращают
любые несвязанные записи в t1 (которые не совпадают с t2).
<SMALL>RIGHT</SMALL> связывание должно добавить несвязанные записи
t2. <SMALL>FULL</SMALL> связывание должно возвратить совпавшие
записи плюс все несвязанные записи из t1 и t2. Слово <SMALL>OUTER</SMALL>
является необязательным и назначается в <SMALL>LEFT</SMALL>,
<SMALL>RIGHT</SMALL> и <SMALL>FULL</SMALL> связываниях. Обычные
связывания называются <SMALL>INNER</SMALL> связывания.</P>
<P>В предыдущих версиях, внешние связывания могли быть эмулированы
используя <SMALL>UNION</SMALL> и <SMALL>NOT IN</SMALL>. Например,
когда происходит связывание <I>tab1</I> и <I>tab2</I>, следующий
запрос выполняет <I>внешнее</I> связывание двух таблиц:<BR>
<BR>
</P>
<PRE>
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
</PRE>
<H4><A name="4.24">4.24</A>) Как выполнять запросы, использующие несколько
баз данных?</H4>
<P>Не существует способа создать запрос к базам данных отличным от текущей.
Поскольку PostgreSQL загружает системные каталоги специфичные для базы
данных, непонятно даже, как должен себя вести такой межбазовый запрос.</P>
<P><I>contrib/dblink</I> позволяет запросы между базами, используя
вызовы функций. Разумеется, клиент может одновременно устанавливать
соедиенения с различными базами данных и таких образом объединять
информацию из них.</P>
<H4><A name="4.25">4.25</A>) Как мне вернуть из функции несколько записей?</H4>
<P>В версии 7.3, вы можете легко вернуть несколько записей или колонок из
какой-либо функции,
<href="http://techdocs.postgresql.org/guides/SetReturningFunctions">
http://techdocs.postgresql.org/guides/SetReturningFunctions</a>.</P>
<H4><A name="4.26">4.26</A>) Почему я не могу надежно создавать/удалять
временные таблицы в функциях PL/PgSQL?</H4>
<P>PL/PgSQL кэширует содержимое функции и один из негативных эффектов этого
состоит в том, что если функция PL/PgSQL обращается к временной таблице
и эта таблица позднее удаляется и пересоздается, а функция затем вызывается
снова, то ее вызов приведет к ошибке, потому что скэшированное содержимое
функции содержит указатель на старую временную таблицу. Чтобы решить эту
проблему, используйте <SMALL>EXECUTE</SMALL> для доступа к временным
таблицам в PL/PgSQL. Использование этого оператора заставит запрос
перегенерироваться каждый раз.</P>
<H4><A name="4.27">4.27</A>) Какие опции репликации существуют?</H4>
<P>Есть несколько опций для репликации типа master/slave. Они допускают
использование только master сервера для внесения изменений в базу данных,
а slave серверы просто позволяют читать данные из базы. Об этом читайте
здесь: <A href="http://gborg.postgresql.org/genpage?replication_research">
http://gborg.PostgreSQL.org/genpage?replication_research</A>. О репликации
с несколькими master серверами читайте здесь:
<a href="http://gborg.postgresql.org/project/pgreplication/projdisplay.php">http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php</A>.</P>
<h4><a name="4.28">4.28</a>) Какие опции шифрования существуют?
</h4>
<ul>
<li><i>contrib/pgcrypto</i> содержит много функций шифрования для
использования в <small>SQL</small> запросах.</li>
<li>Для шифрования передаваемых данных от клиента к серверу, на сервере
в файле <i>postgresql.conf</i>, опция <i>ssl</i> должна быть установлена
в <i>true</i>, в файле <i>pg_hba.conf</i> должна быть соответствующая
запись <i>host</i> или <i>hostssl</i> и на стороне клиента <i>sslmode</i>
не должен быть запрещён через <i>disable</i>. (Заметим, что также
возможно использование независимых внешних шифрующих транспортов, таких
как stunnel или ssh, вместо собственных SSL соединений PostgreSQL).</li>
<li>Пароли пользователей к базе данных автоматически шифруются, при
сохранении в версии 7.3. В предыдущих версиях, вы должны разрешить
опцию <i>PASSWORD_ENCRYPTION</i> в <i>postgresql.conf</i>.</li>
<li>Сервер можно запустить, используя шифрованную файловую систему.</li>
</ul>
<HR>
<H2 align="center">Расширения PostgreSQL</H2>
<H4><A name="5.1">5.1</A>) Я написал функцию определяемую пользователем.
Когда я запускаю ее в <I>psql</I>, почему я получаю core dump?</H4>
<P>Проблема может заключаться в нескольких вещах. Попытайтесь сперва
протестировать вашу функцию в отдельной самостоятельной программе.</P>
<H4><A name="5.2">5.2</A>) Как я могу внести некоторые классные новые
типы и функции в PostgreSQL?</H4>
<P>Отправьте ваши расширения в список рассылки <I>pgsql-hackers</I>
и они по возможности будут помещены в подкаталог <I>contrib/</I>.</P>
<H4><A name="5.3">5.3</A>) Как мне написать C функцию, возвращающую
запись?</H4>
<P>В версиях PostgreSQL, начиная с 7.3, функции, возвращающие таблицы
полностью поддерживаются в C, PL/PgSQL и SQL. Подробности смотрите в
Руководстве Программиста. Пример возвращающей таблицу функции,
написанной на C, можно найти в <i>contrib/tablefunc</i>.</P>
<H4><A name="5.4">5.4</A>) Я изменил исходный файл. Почему после
перекомпиляции я не вижу изменений?</H4>
<P>Файлы <I>Makefile</I> не имеют правильных зависимостей для include
файлов. Вы должны выполнить <I>make clean</I> и затем <I>make</I>.
Если вы используете <SMALL>GCC</SMALL> вы можете использовать опцию
<I>--enable-depend</I> в <I>configure</I> чтобы поручить компилятору
автоматически отслеживать зависимости.</P>
</BODY>
</HTML>