1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-02 11:44:50 +03:00
postgres/doc/src/FAQ/FAQ_russian.html
Bruce Momjian 3f540711ef Update Russian FAQ.
Victor Vislobokov
2005-09-28 11:32:49 +00:00

1111 lines
49 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>Дата последнего обновления: Пятница 16 сентября 14:07:22 EDT 2005</P>
<P>Английский вариант сопровождает: Брюс Момьян (Bruce Momjian) (<A href=
"mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR>
</P>
<P>Перевёл на русский: Виктор Вислобоков (<A href=
"mailto:admin@linuxshare.ru">admin@linuxshare.ru</A>)<BR>
</P>
<P>Самую свежую английскую версию документа можно найти на
<A href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.PostgreSQL.org/files/documentation/faqs/FAQ.html</A>.</P>
<P>Ответы на вопросы специфичные для конкретных платформ можно найти на
<A href="http://www.postgresql.org/docs/faq/">http://www.PostgreSQL.org/docs/faq/</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>) На каких платформах работает PostgreSQL?<BR>
<A href="#1.4">1.4</A>) Где можно взять PostgreSQL?<BR>
<A href="#1.5">1.5</A>) Где получить поддержку?<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>) Как присоединится к команде разработчиков?<BR>
<A href="#1.12">1.12</A>) Как сравнивать PostgreSQL с другими
<SMALL>СУБД</SMALL>?<BR>
<A href="#1.13">1.13</A>) Кто управляет PostgreSQL?<BR>
<H2 align="center">Вопросы пользователей по клиентской части</H2>
<A href="#2.1">2.1</A>) Какие интерфейсы есть для PostgreSQL?<BR>
<A href="#2.2">2.2</A>) Какие инструменты существуют для использования
PostgreSQL через Web?<BR>
<A href="#2.3">2.3</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>) Как мне управлять соединениями с других
компьютеров?<BR>
<A href="#3.3">3.3</A>) Какие настройки мне нужно сделать для улучшения
производительности?<BR>
<A href="#3.4">3.4</A>) Какие возможности для отладки есть в наличии?<BR>
<A href="#3.5">3.5</A>) Почему я получаю сообщение <I>"Sorry, too many
clients"</I> когда пытаюсь подключиться к базе?<BR>
<A href="#3.6">3.6</A>) Почему необходимо делать dump и restore при
обновлении выпусков PostgreSQL?<BR>
<A href="#3.7">3.7</A>) Какое компьютерное "железо" я должен
использовать?<BR>
<H2 align="center">Вопросы эксплуатации</H2>
<A href="#4.1">4.1</A>) Как выполнить <SMALL>SELECT</SMALL> только
для нескольких первых строчек запроса? Для произвольной строки?<BR>
<A href="#4.2">4.2</A>) Как мне найти какие таблицы, индексы,
базы данных и пользователи существуют? Как мне увидеть запросы,
которые использует <I>psql</I> для получения этой информации?<BR>
<A href="#4.3">4.3</A>) Как изменить тип данных колонки?<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>) Как мне определить, что значение поля равно
<SMALL>NULL</SMALL> в каком-либо запросе? Могу я отсортировать поля
<SMALL>NULL</SMALL> или нет?<BR>
<A href="#4.10">4.10</A>) Каковы отличия между разными символьными
типами?<BR>
<A href="#4.11.1">4.11.1</A>) Как мне создать поле serial/с-авто-увеличением?<BR>
<A href="#4.11.2">4.11.2</A>) Как мне получить значение при вставке
<SMALL>SERIAL</SMALL>?<BR>
<A href="#4.11.3">4.11.3</A>) Не может ли получиться так, что
использование <I>currval()</I> и <I>nextval()</I> приведет к
зациклированию с другими пользователями?<BR>
<A href="#4.11.4">4.11.4</A>) Почему числа из моей последовательности
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?<BR>
<A href="#4.12">4.12</A>) Что такое <SMALL>OID</SMALL>? Что такое
<SMALL>CTID</SMALL>?<BR>
<A href="#4.13">4.13</A>) Почему я получаю ошибку <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?<BR>
<A href="#4.14">4.14</A>) Как мне узнать, какая версия PostgreSQL
запущена?<BR>
<A href="#4.15">4.15</A>) Как мне создать колонку которая по умолчанию
будет содержать текущее время?<BR>
<A href="#4.16">4.16</A>) Как выполнить внешнее связывание?<BR>
<A href="#4.17">4.17</A>) Как выполнять запросы, использующие несколько
баз данных?<BR>
<A href="#4.18">4.18</A>) Как мне вернуть из функции несколько строк таблицы?<BR>
<A href="#4.19">4.19</A>) Почему я получаю ошибку "relation with OID ####
не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?<BR>
<A href="#4.20">4.20</A>) Какие есть решения для репликации?<BR>
<A href="#4.21">4.21</A>) Почему имена таблицы и колонок не
распознаются в в моём запросе?<BR>
<HR>
<H2 align="center">Общие вопросы</H2>
<H3><A name="1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название?</H3>
<P>PostgreSQL произносится <I>Post-Gres-Q-L (Пост-Грес-Кью-Эл)</I>,
также иногда говорят просто <I>Postgres</I>. Вы можете услышать как
это произносится с помощью аудиофайла, который доступен в
<A href="http://www.postgresql.org/files/postgresql.mp3">формате MP3</A>.
</P>
<P>PostgreSQL - это объектно-реляционная система управления базами
данных (СУБД), которая имеет традиционные возможности коммерческих
<small>СУБД</small> с расширениями, которые есть в <small>СУБД</small>
нового поколения. PostgreSQL - это свободное и полностью открытое
программное обеспечение.</P>
<P>Разработку PostgreSQL выполняет команда разработчиков, разбросанная
по всему миру и связанная через Интернет. Разработка является
общественным проектом и не управляется какой-либо компанией.
Подробности смотрите в FAQ для разработчиков,
<A href="http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html">
http://www.PostgreSQL.org/files/documentation/faqs/FAQ_DEV.html</A>
</P>
<H3><A name="1.2">1.2</A>) Каковы авторские права на PostgreSQL?</H3>
<P>PostgreSQL распространяется по классической лицензии BSD. Эта
лицензия не содержит ограничений на то, как будет использоваться
исходный код. Нам нравится эта лицензия и у нас нет намерений её
менять.</P>
<P>Вот эта лицензия BSD, которую мы используем:</P>
<P>Система Управления Базами Данных PostgreSQL</P>
<P>Portions copyright (c) 1996-2005, PostgreSQL Global Development
Group Portions Copyright (c) 1994-1996 Regents of the University of
California</P>
<P>Предоставляются права на использование, копирование, изменение
и распространение данного программного обеспечения и его документации
для любых целей, бесплатно и без подписания какого-либо соглашения,
при условии что для каждой копии будут предоставлены данное выше
замечание об авторских правах, текущий параграф и два следующих
параграфа.</P>
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ
ЗА ЛЮБЫЕ ПОВРЕЖДЕНИЯ, ВКЛЮЧАЯ ПОТЕРЮ ДОХОДА, НАНЕСЕННЫЕ ПРЯМЫМ
ИЛИ НЕПРЯМЫМ, СПЕЦИАЛЬНЫМ ИЛИ СЛУЧАЙНЫМ ИСПОЛЬЗОВАНИЕМ ДАННОГО
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ
КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ БЫЛ ИЗВЕЩЕН О ВОЗМОЖНОСТИ ТАКИХ
ПОВРЕЖДЕНИЙ.</P>
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ СПЕЦИАЛЬНО ОТКАЗЫВАЗЫВАЕТСЯ ПРЕДОСТАВЛЯТЬ
ЛЮБЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ТОЛЬКО ЭТИМИ ГАРАНТИЯМИ:
НЕЯВНЫЕ ГАРАНТИИ ПРИГОДНОСТИ ТОВАРА ИЛИ ПРИГОДНОСТИ ДЛЯ ОТДЕЛЬНОЙ ЦЕЛИ.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ ПРИЦИПА
"КАК ЕСТЬ" И КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ ОБЯЗАН ПРЕДОСТАВЛЯТЬ
СОПРОВОЖДЕНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, РАСШИРЕНИЯ ИЛИ ИЗМЕНЕНИЯ.</P>
<H3><A name="1.3">1.3</A>) На каких платформах работает PostgreSQL?</H3>
<P>Обычно, PostgreSQL может работать на любой современной платформе
совместимой с Unix. В инструкции по установке, вы найдете список
тех платформ, на которых были проведены тестовые запуски PostgreSQL
к моменту выхода данной версии.</P>
<P>PostgreSQL также работает на операционных системах Microsoft
Windows, основанных на NT, таких как Win2000, WinXP и Win2003.
Пакет инсталлятора доступен по адресу
<A href="http://pgfoundry.org/projects/pginstaller">
http://pgfoundry.org/projects/pginstaller</A>. Версии Windows,
основанные на MS-DOS (Win95, Win98, WinMe) могут запускать
PostgreSQL с помощью Cygwin.</P>
<P>Также существует версия спортированная под Novell Netware 6 на
<A href="http://forge.novell.com/">http://forge.novell.com</A>,
и версия для OS/2 (eComStation) на
<A href="http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F">
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F</A>.</P>
<H3><A name="1.4">1.4</A>) Где можно взять PostgreSQL?</H3>
<P>Через браузер, используя <a href="http://www.postgresql.org/ftp/">
http://www.postgresql.org/ftp/</a> и через ftp, используя
<A href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</A>.</P>
<H3><A name="1.5">1.5</A>) Где получить поддержку?</H3>
<P>Сообщество PostgreSQL предоставляет помощь множеству пользователей
через E-mail. Основной web-сайт для подписки на списки рассылки по
E-mail это: <A href="http://www.postgresql.org/community/lists/">
http://www.postgresql.org/community/lists/</A>. Хорошим местом для
того, чтобы начать задавать вопросы являются списки <i>general</i>
(общие вопросы) или <i>bugs</i> (ошибки).</P>
<P>Главным IRC каналом является <I>#postgreql</I>,
расположенный на сервере Freenode (<I>irc.freenode.net</I>). Чтобы
подключиться, вы можете использовать в Unix вызов программы
<code>irc -c '#postgresql' "$USER" irc.freenode.net</code> или
любой другой IRC клиент. На этом же сервере существуют каналы на
испанском (<I>#postgresql-es</I>) и французском (<I>#postgresqlfr</I>)
языках. Также существует канал по PostgreSQL на сервере EFNet.</P>
<P>Список коммерческой поддержки компаний доступен на
<A href="http://techdocs.postgresql.org/companies.php">
http://techdocs.postgresql.org/companies.php</A>.</P>
<H3><A name="1.6">1.6</A>) Как мне сообщить об ошибке?</H3>
<P>Посетите страничку со специальной формой отчёта об ошибке в
PostgreSQL по адресу:
<A HREF="http://www.postgresql.org/support/submitbug">
http://www.postgresql.org/support/submitbug</A>.</P>
<P>Также проверьте наличие более свежей версии PostgreSQL на нашем
FTP сайте <A href="ftp://ftp.postgresql.org/pub/">
ftp://ftp.PostgreSQL.org/pub/</A>.
<H3><A name="1.7">1.7</A>) Какая последняя версия?</H3>
<P>Последний выпуск PostgreSQL - это версия 8.0.3</P>
<P>Мы планируем выпускать новые старшие версии каждый год,
а младшие версии каждые несколько месяцев.</P>
<H3><A name="1.8">1.8</A>) Какая документация имеется в наличии?</H3>
<P>PostgreSQL содержит много документации, включая большое руководство,
страницы электронного руководства 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/books/awbook.html">http://www.PostgreSQL.org/docs/books/awbook.html</A>
и <a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>.
Есть несколько книг по PostgreSQL, которые можно купить.
Одну из наиболее популярных написал Корри Дуглас (Korry Douglas).
Список обзоров по этим книгам доступен по адресу
<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>
<H3><A name="1.9">1.9</A>) Как найти информацию об известных ошибках
или отсутствующих возможностях?</H3>
<P>PostgreSQL поддерживает расширенный подкласс <SMALL>SQL</SMALL>-92.
Смотрите наш список <A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
на предмет известных ошибок, отсутствующих возможностей и будущих
планов.</P>
<H3><A name="1.10">1.10</A>) Как мне научиться <SMALL>SQL</SMALL>?</H3>
<P>Во-первых, возьмите одну из книг по PostgreSQL, о которых говорилось
выше. Еще один учебник - это книга "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>.
Многим из наших пользователей нравится книга
<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>
Есть прекрасный учебник на <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>
<H3><A name="1.11">1.11</A>) Как присоединится к команде разработчиков?</H3>
<P>Смотрите <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
FAQ для разработчиков</A>.</P>
<H3><A name="1.12">1.12</A>) Как сравнивать PostgreSQL с другими
<SMALL>СУБД</SMALL>?</H3>
<P>
Существует несколько методов сравнения программного обеспечения:
возможности, производительность, надежность, поддержка и цена.</P>
<DL>
<DT><B>Возможности</B></DT>
<DD>PostgreSQL имеет большинство возможностей представленных
в больших коммерческих <SMALL>СУБД</SMALL>, такие как: транзакции,
подзапросы, триггеры, представления, ссылочной
целостности вторичного ключа и разные блокировки. У нас есть некоторые возможности,
которых нет у них: типы, определяемые пользователем, механизм
наследования, правила и конкуретное многоверсионное управление
для работы с содержимым блокировок.<BR>
<BR>
</DD>
<DT><B>Производительность</B></DT>
<DD>Производительность PostgreSQL сходна с другими коммерческими
СУБД и с СУБД с открытым исходным кодом. В каких-то вещах мы быстрее,
в каких-то медленнее. Наша производительности обычно +/-10% по
сравнению с другими СУБД.
<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.5">Секцию 1.5</A>.)<BR>
<BR>
</DD>
<DT><B>Цена</B></DT>
<DD>Наш продукт бесплатен как для коммерческого так, и не для
коммерческого использования. Вы можете добавлять свой код в наш
продукт без ограничений, за исключением тех, что описываются в
нашей лицензии стиля BSD, которая приведена выше.<BR>
<BR>
</DD>
</DL>
<H3><A name="1.13">1.13</A>) Кто управляет PostgreSQL?</H3>
<P>Если вы ищите какого-то особенного человека, центральный
комитет или управляющую компанию, то напрасно --- их нет.
У нас есть ядро комитета и разработчиков, работающих с CVS,
но эти группы служат больше для административных целей, чем
для управления. Проект напрямую функционирует с помощью
сообщества разработчиков и пользователей, к которому может
присоединится каждый. Всё что нужно -- это подписаться на
списки рассылки и участвовать в дискуссиях. (Подробности о
том как включиться в разработку PostgreSQL смотрите в
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
FAQ для разработчиков</A>.)</P>
<HR>
<H3 align="center">Вопросы пользователей по клиентской части</H3>
<H3><A name="2.1">2.1</A>) Какие интерфейсы есть для PostgreSQL?</H3>
<P>Установка PostgreSQL включает только <small>C</small> и встроенный
(embedded) <small>C</small> интерфейсы. Все другие интерфейсы
являются независимыми проектами и загружаются отдельно; самостоятельность
проектов позволяет им организовать собственное расписание выпусков
новых версий и иметь собственную команду разработчиков.</P>
<P>Некоторые языки программирования, такие как <small>PHP</small>
включают в себя интерфейс к PostgreSQL. Интерфейсы для таких языков
как Perl, <small>TCL</small>, Python и многих других, доступны на
<A href="http://gborg.postgresql.org">http://gborg.postgresql.org</A>
в секции <i>Drivers/Interfaces</I>, а также через поиск в Интернет.</P>
<H3><A name="2.2">2.2</A>) Какие инструменты существуют для использования
PostgreSQL через Web?</H3>
<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 и DBD::Pg с CGI.pm
или mod_perl.</P>
<H3><A name="2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
пользователя?</H3>
<P>Да, подробности смотрите в <a href="http://techdocs.postgresql.org/guides/GUITools">
http://techdocs.postgresql.org/guides/GUITools</A>.</P>
<HR>
<H2 align="center">Вопросы администрирования</H2>
<H3><A name="3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
от <I>/usr/local/pgsql</I>?</H3>
<P>Задайте опцию <I>--prefix</I> когда запускаете <I>configure</I>.</P>
<H3><A name="3.2">3.2</A>) Как мне управлять соединениями с других
компьютеров?</H3>
<P>По умолчанию, PostgreSQL разрешает только соединения на локальной
машине через сокеты домена Unix или TCP/IP соединения. Для того, чтобы
другие машины смогли подключиться к базе вы должны изменить
<I>listen_addresses</I> в <I>postgresql.conf</I>, разрешить
host-авторизация в файле <I>$PGDATA/pg_hba.conf</I> и перестартовать
сервер.</P>
<H3><A name="3.3">3.3</A>) Какие настройки мне нужно сделать для улучшения
производительности?</H3>
<P>Существует три главных области, которые потенциально могут
увеличить производительность:</P>
<DL>
<DT><B>Изменение запроса</B></DT>
<DD>Это означает модификацию запросов для получения лучшей
производительности:
<UL>
<LI>Создание индексов, включая индексы выражений и частичные индексы</LI>
<LI>Использование COPY вместо множества <small>INSERT</small></LI>
<LI>Группировка нескольких операторов в единую транзакцию для
уменьшения нагрузки при выполнении завершения транзакции</LI>
<LI>Использование <small>CLUSTER</small>, когда из индекса берётся
множество строк</LI>
<LI>Использование <small>LIMIT</small> для того, чтобы возвращалась
только часть вывода от запроса</LI>
<LI>Использование Подготовленных (Prepared) запросов</LI>
<LI>Использование <small>ANALYZE</small> для обслуживания статистики
оптимизатора</LI>
<LI>Регулярное использование <small>VACUUM</small> или <I>pg_autovacuum</I></LI>
<LI>Удаление индексов во время больших изменений данных</LI>
</UL>
<BR><BR>
</DD>
<DT><B>Настройка сервера</B></DT>
<DD>Некоторые установки в <I>postgresql.conf</I> влияют на
производительность. Подробный полный список установок см. в
<A href="http://www.postgresql.org/docs/current/static/runtime.html">
Administration Guide/Server Run-time Environment/Run-time Configuration</A>,
а комментарии см. в <A href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</A>
и <A href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</A>.
<BR><BR>
</DD>
<DT><B>Выбор "железа" - аппаратного обеспечения</B></DT>
<DD>Влияние "железа" на производительность подробно описано в
<A href="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html">
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html</A> и
<A href="http://www.powerpostgresql.com/PerfList/">
http://www.powerpostgresql.com/PerfList/</A>.
<BR><BR>
</DD>
</DL>
<H3><A name="3.4">3.4</A>) Какие возможности для отладки есть в
наличии?</H3>
<P>Есть множество установок в настройках сервера, начинающихся
на <code>log_*</code>, позволяющих протоколировать запросы
и статистику работы процесса, которая очень полезна для отладки
и измерения производительности.</P>
<H3><A name="3.5">3.5</A>) Почему я получаю сообщение <I>"Sorry, too
many clients"</I> когда пытаюсь подключиться к базе?</H3>
<P>Вы достигли установленного по умолчанию ограничения на 100 сессий
подключения к базе данных. Вам необходимо увеличить для
<I>postmaster</I> лимит на количество конкурентных backend процессов,
изменив значение <I>max_connections</I> в файле <I>postgresql.conf</I>
и перестартовать <I>postmaster</I>.</P>
<H3><A name="3.6">3.6</A>) Почему необходимо делать dump и restore при
обновлении выпусков PostgreSQL?</H3>
<P>Разработчики PostgreSQL делают только небольшие изменения между
подвыпусками. Таким образом обновление с версии 7.4.0 до 7.4.1 не требует
выполнения dump и restore. Однако при выходе очередного выпуска
(т.е. при обновлении например, с 7.3 на 7.4) часто меняется внутренний
формат системных таблиц и файлов данных. Эти изменения часто носят
комплексный характер, так что нет возможности обеспечить обратную
совместимость файлов данных. Выполение dump позволяет получить данные
в общем формате, который затем может быть загружен при использовании
нового внутреннего формата.</P>
<P>В тех выпусках, где формат данных на диске не меняется, для проведения
обновления может быть использован сценарий <i>pg_upgrade</i> без
использования dump/restore. Комментарии к выпуску говорит когда можно
использовать <i>pg_upgrade</i> для этого выпуска.</P>
<H3><A name="3.7">3.7</A>) Какое компьютерное "железо" я должен
использовать?</H3>
<P>Поскольку "железо" персональных компьютеров является наиболее
совместимым, люди склонны верить, что такое "железо" имеет одинаковое
качество. Это не так. Память ECC, SCSI и качественные материнские платы
являются более надёжными и имеют более лучшую производительность, чем
менее дорогое "железо". PostgreSQL будет работать на любом "железе",
но если для вас важны надёжность и производительность, то с вашей стороны
будет мудро поставить соответствующее "железо". Обсудить разное "железо"
можно в наших списках рассылки.</P>
<HR>
<H2 align="center">Вопросы эксплуатации</H2>
<H3><A name="4.1">4.1</A>) Как выполнить <SMALL>SELECT</SMALL> только
для нескольких первых строчек запроса? Произвольной строки?</H3>
<P>Для получения только нескольких строк, если вы знаете их количество
на момент выполнения <SMALL>SELECT</SMALL> используйте <SMALL>LIMIT</SMALL>.</P>
Если есть какой-либо индекс, который совпадает с <SMALL>ORDER BY</SMALL>,
то возможно, что весь запрос выполнен и не будет. Если вы не знаете
количества необходимых строк на момент выполнения <SMALL>SELECT</SMALL>,
используйте курсор и <SMALL>FETCH</SMALL>.</P>
<P>To <small>SELECT</small> a random row, use:</P>
<PRE> SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</PRE>
<H3><A name="4.2">4.2</A>) Как мне найти какие таблицы, индексы,
базы данных и пользователи существуют? Как мне увидеть запросы,
которые использует <I>psql</I> для получения этой информации?</H3>
<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>SQL</SMALL>
совместимый с INFORMATION SCHEMA интерфейс, с помощью которого, вы
можете сформировать запрос на получение информации о базе данных.</P>
<P>Также существуют системные таблицы, начинающиеся с <I>pg_</I>.</P>
<P>Используйте <I>psql -l</I> для получения списка всех баз данных.</P>
<P>Также посмотрите файл <I>pgsql/src/tutorial/syscat.source</I>.
Он показывает многие из операторов <SMALL>SELECT</SMALL> необходимых
для получения информации из системных таблиц базы данных.</P>
<H3><A name="4.3">4.3</A>) Как изменить тип данных колонки?</H3>
<P>В 8.0 и более поздних версиях, изменение типа колонки выполняется
очень легко через <SMALL>ALTER TABLE ALTER COLUMN TYPE</SMALL>.</P>
<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>
<H3><A name="4.4">4.4</A>) Каковы максимальные размеры для строк в таблице,
таблиц и базы данных?</H3>
<P>Существуют следующие ограничения:</P>
<BLOCKQUOTE>
<TABLE>
<TR>
<TD>Максимальный размер базы?</TD>
<TD>неограничен (существуют базы на 32 TB)</TD>
</TR>
<TR>
<TD>Максимальный размер таблицы?</TD>
<TD>32 TB</TD>
</TR>
<TR>
<TD>Максимальный размер строки?</TD>
<TD>1.6 TB</TD>
</TR>
<TR>
<TD>Максимальный размер поля?</TD>
<TD>1 GB</TD>
</TR>
<TR>
<TD>Максимальное количество строк в таблице?</TD>
<TD>неограничено</TD>
</TR>
<TR>
<TD>Максимальное количество колонок в таблице?</TD>
<TD>250-1600 в зависимости от типа</TD>
</TR>
<TR>
<TD>Максимальное количество индексов в таблице?</TD>
<TD>неограничено</TD>
</TR>
</TABLE>
</BLOCKQUOTE>
<BR>
<P>Разумеется, понятие "неограничено" на самом деле ограничивается
доступным дисковым пространиством и размерами памяти/своппинга.
Когда значения перечисленные выше неоправдано большие, может
пострадать производительность.</P>
<P>Максимальный размер таблицы в 32 TB не требует чтобы операционная
система поддерживала файлы больших размеров. Большие таблицы хранятся
как множество файлов размером в 1 GB, так что ограничения, которые
накладывает файловая система не важны.</P>
<P>Максимальный размер таблицы и максимальное количество колонок
могут быть увеличены в четыре раза, если размер блока по умолчанию будет
увеличен до 32k.</P>
<P>Существует ограничение, по которому индексы не могут создаваться для
колонок длиннее чем 2,000 символов. К счастью такие индексы вряд ли
действительно кому-то нужны. Уникальность гарантируется наилучим образом,
с помощью функционального индекса из хэша MD5 длинной колонки, а
полнотекстовое индексирование позволяет искать слова внутри колонки.</P>
<H3><A name="4.5">4.5</A>) Как много дискового пространства в базе данных
нужно для сохранения данных из обычного текстового файла?</H3>
<P>СУБД PostgreSQL может потребоваться дискового пространства до 5 раз
больше для сохранения данных из простого текстового файла.</P>
<P>В качестве примера, рассмотрим файл в 100,000 строк в каждой, из
которых целое число и текстовое описание. При этом длина текста,
в среднем, составляет 20 байт. Размер простого файла составит 2.8 MB.
Размер базы PostgreSQL, содержащей эти же данные составит приблизительно
6.4 MB из которых:</P>
<PRE>
28 байт: на каждый заголовок строки в таблице (приблизительно)
+ 24 байта: одно поле с целочисленным типом и одно текстовое поле
+ 4 байта: указатель на странице для всей табличной строки
----------------------------------------
56 байт на строку в таблице
Размер страницы данных в PostgreSQL составляет 8192 байт (8 KB), так что:
8192 байт на страницу
--------------------- = 146 строк в таблице на страницу БД (округлённо)
56 байт на строку в таблице
100000 строк данных
----------------------- = 685 страниц в БД (округлённо)
146 строк в таблице на страницу
685 страниц БД * 8192 байт на страницу = 5,611,520 байт (5.6 MB)
</PRE>
<P>Индексы не требуют так много, но поскольку они создаются для
большого количества данных, они также могут быть велики.</P>
<P>Значения <small>NULL</small> хранятся как битовые карты и поэтому они
занимают очень мало места.
</P>
<H3><A name="4.6">4.6</A>) Почему мои запросы работают медлено? Почему
они не используют мои индексы?</H3>
<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.8">4.8</A>.</LI>
<LI>Во время <i>initdb</i> должна использоваться локаль по умолчанию
<i>C</i>, потому что не существует возможности узнать следующий наибольший
символ для не-C локали. Вы можете для таких случаев создать специальный
индекс <CODE>text_pattern_ops</CODE> который работает только для
<SMALL>LIKE</SMALL> индексирования.</LI>
</UL>
<P>В выпусках до версии 8.0, индексы часто нельзя было использовать,
если типы данных точно не совпадали с индексными типами колонок. Это
особенно касалось int2, int8 и numeric индексов колонок.</P>
<H3><A name="4.7">4.7</A>) Как посмотреть на то, как оптимизатор выполняет
мой запрос?</H3>
<P>Смотрите страницу руководства посвященную <SMALL>EXPLAIN</SMALL>.</P>
<H3><A name="4.8">4.8</A>) Как мне выполнить поиск регулярного выражения
и поиск независимый от регистра букв поиск регулярного выражения?
Как мне использовать индекс для поиска независимого от регистра букв?</H3>
<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>
<P>Если вышеуказанный индекс создаётся как <SMALL>UNIQUE</SMALL>, то
колонка, для которой он создаётся может хранить символы и в верхнем,
и в нижнем регистре, индес не может иметь идентичных значений, которые
отличаются только регистром. Чтобы в колонке можно было хранить символы
только в определённом регистре, используйте ограничение
<SMALL>CHECK</SMALL> или проверку через триггер.</P>
<H3><A name="4.9">4.9</A>) Как мне определить, что значение поля равно
<SMALL>NULL</SMALL> в каком-либо запросе? Могу я отсортировать поля
<SMALL>NULL</SMALL> или нет?</H3>
<P>Вы просто сравниваете значение с <SMALL>IS NULL</SMALL> и
<SMALL>IS NOT NULL</SMALL>, как здесь:</P>
<PRE>
SELECT *
FROM tab
WHERE col IS NULL;
</PRE>
<P>Чтобы отсортировать данные по значению <NULL> используйте модификаторы
<SMALL>IS NULL</SMALL> и <SMALL>IS NOT NULL</SMALL> в выражении
<SMALL>ORDER BY</SMALL>. Когда они будут генерировать значения
<I>истина</I>, то при сортировке они будут выше, чем значения
<I>ложь</I>, так что записи с NULL будут в отсортированном списке сверху:</P>
<PRE>
SELECT *
FROM tab
ORDER BY (col IS NOT NULL);
</PRE>
<H3><A name="4.10">4.10</A>) Каковы отличия между разными символьными
типами?</H3>
<BLOCKQUOTE>
<TABLE>
<TR>
<TH>Тип</TH>
<TH>Внутреннее имя</TH>
<TH>Замечания</TH>
</TR>
<TR>
<TD>VARCHAR(n)</TD>
<TD>varchar</TD>
<TD>размер задает максимальную длину, нет заполнения</TD>
</TR>
<TR>
<TD>CHAR(n)</TD>
<TD>bpchar</TD>
<TD>заполняется пустотой до фиксированной длины</TD>
</TR>
<TR>
<TD>TEXT</TD>
<TD>text</TD>
<TD>нет задаваемого верхнего ограничения или длины</TD>
</TR>
<TR>
<TD>BYTEA</TD>
<TD>bytea</TD>
<TD>массив байт переменной длины (можно использовать null-байт без опаски)</TD>
</TR>
<TR>
<TD>"char"</TD>
<TD>char</TD>
<TD>один символ</TD>
</TR>
</TABLE>
</BLOCKQUOTE>
<P>Внутреннее имя вы можете увидеть, когда смотрите системные каталоги
и в некоторых сообщениях об ошибках.</P>
<P>Первые четыре типа являются "varlena" типами (т.е., первые
четыре байта на диске являются длинной, за которой следуют данные).
Таким образом, фактически используемое пространство больше, чем
обозначенный размер. Однако, длинные значения также сжимаются,
так что занимаемое дисковое пространство может также быть и меньше,
чем ожидалось.</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>
<H3><A name="4.11.1">4.11.1</A>) Как мне создать поле
serial/с-авто-увеличением?</H3>
<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>.
<H3><A name="4.11.2">4.11.2</A>) Как мне получить значение при вставке
<SMALL>SERIAL</SMALL>?</H3>
<P>Один из способов состоит в получении следующего значения
<SMALL>SERIAL</SMALL> из объекта sequence с помощью функции
<I>nextval()</I> <I>перед</I> вставкой и затем вставлять это значение
явно. Используйте таблицу-пример в <A href="#4.11.1">4.11.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>
<H3><A name="4.11.3">4.11.3</A>) Не может ли получиться так, что
использование <I>currval()</I> и <I>nextval()</I> приведет к
зациклированию с другими пользователями?</H3>
<P>Нет. <i>currval()</i> возвращает текущее значение, назначенное вашей
сессией, а не другими сессиями.</P>
<H3><A name="4.11.4">4.11.4</A>) Почему числа из моей последовательности
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?</H3>
<P>Для реализации конкуретности, значения последовательностей, при
необходимости выдаются во время запуска транзакций и не блокируются
до полного выполнения транзакций. Это может вызывать разрывы в
нумерации при отмене транзакций.</P>
<H3><A name="4.12">4.12</A>) Что такое <SMALL>OID</SMALL>? Что такое
<SMALL>CTID</SMALL>?</H3>
<P>Каждая, создаваемая в PostgreSQL табличная строка, получает уникальный
индентификатор <SMALL>OID</SMALL> за исключением случая когда
использовалось <SMALL>WITHOUT OIDS</SMALL>. O<SMALL>ID</SMALL> - это
автоматически назначаемое уникальное 4-х байтовое целое число.
Однако, после того как его значение превысит 4 миллиарда, значения
O<SMALL>ID</SMALL> начинают дублироваться. PostgreSQL использует
<SMALL>OID</SMALL> для связывания своих внутренних таблиц.</P>
<P>Для уникальных значений в колонках таблицы пользователя, лучшим
способом является использование <SMALL>SERIAL</SMALL> вместо
O<SMALL>ID</SMALL>, потому что последовательности <SMALL>SERIAL</SMALL>
уникальны только внутри таблицы и таким образом меньше подвержены
переполнению. Для хранения значений 8-ми байтной последовательности
доступен тип <SMALL>SERIAL8</SMALL>.
<P>C<SMALL>TID</SMALL> используется для идентификации специальных
физических записей с блочными и offset значениями. C<SMALL>TID</SMALL>
изменяется после того как строки в таблице были изменены или перегружены.
<P>T<SMALL>ID</SMALL> используется индексными записями в качестве
указателя на физические записи.</P>
<H3><A name="4.13">4.13</A>) Почему я получаю ошибку <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?</H3>
<P>Предположительно у вас закончилась виртуальная память
или что ваше ядро имеет маленький лимит на определенные ресурсы.
Попытайтесь перед запуском <I>postmaster</I> выполнить следующие
команды:</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
В зависимости от командного интерпретатора shell, только одна из данных
команд выполнится успешно, но она позволит вам установить больший
сегмент данных процесса и возможно решит проблему. Эта команда
изменяет параметры текущего процесса и всех его потомков, созданных
после её запуска. Если у вас возникла проблема с <SMALL>SQL</SMALL>
клиентом, потому что backend возвращает слишком большой объем данных,
попытайтесь выполнить эту команду перед запуском клиента.
<H3><A name="4.14">4.14</A>) Как мне узнать, какая версия PostgreSQL
запущена?</H3>
<P>Из <I>psql</I>, наберите <CODE>SELECT version();</CODE></P>
<H3><A name="4.15">4.15</A>) Как мне создать колонку которая по умолчанию
будет содержать текущее время?</H3>
<P>Используйте <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</PRE>
<H3><A name="4.16">4.16</A>) Как мне выполнить внешнее связывание?</H3>
<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>
<H3><A name="4.17">4.17</A>) Как выполнять запросы, использующие несколько
баз данных?</H3>
<P>Не существует способа создать запрос к базам данных отличным от текущей.
Поскольку PostgreSQL загружает системные каталоги специфичные для базы
данных, непонятно даже, как должен себя вести такой межбазовый запрос.</P>
<P><I>contrib/dblink</I> позволяет запросы между базами, используя
вызовы функций. Разумеется, клиент может одновременно также устанавливать
соедиенения с различными базами данных и таких образом объединять
информацию из них.</P>
<H3><A name="4.18">4.18</A>) Как мне вернуть из функции несколько строк таблицы?</H3>
<P>Вы можете легко использовать функции, возвращающие список,
<A href="http://techdocs.postgresql.org/guides/SetReturningFunctions">
http://techdocs.postgresql.org/guides/SetReturningFunctions</A>.</P>
<H3><A name="4.19">4.19</A>) Почему я получаю ошибку "relation with OID ####
не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?</H3>
<P>PL/PgSQL кэширует сценарии функции и один из негативных эффектов этого
состоит в том, что если функция PL/PgSQL обращается к временной таблице
и эта таблица позднее удаляется и пересоздается, а функция затем вызывается
снова, то ее вызов приведет к ошибке, потому что скэшированное содержимое
функции содержит указатель на старую временную таблицу. Чтобы решить эту
проблему, используйте <SMALL>EXECUTE</SMALL> для доступа к временным
таблицам в PL/PgSQL. Использование этого оператора заставит запрос
перегенерироваться каждый раз.</P>
<H3><A name="4.20">4.20</a>) Какие есть решения для репликации?</H3>
<P>Хотя "репликация" -- это единый термин, есть несколько разных технологий
для выполнения репликаций с разными особенностями для каждой.</P>
<P>Репликация Master/slave позволяет иметь один главный (master) сервер
для выполнения запросов чтения/записи, в то время как подчинённые
(slave) сервера могут производить только запросы
чтения/<SMALL>SELECT</SMALL>. Наиболее популярным решением для репликации
master-slave в PostgreSQL является
<A href="http://gborg.postgresql.org/project/slony1/projdisplay.php">
Slony-I</A>.</P>
<P>Репликация Multi-master позволяет выполнять запросы чтения/записи
на нескольких, реплицируемых друг с другом компьюетрах. Эта особенность
также приводит к потере производительности, потому что необходима
синхронизация изменений между несколькими серверами. Наиболее
популярным решением для такой репликации в PostgreSQL является
<A href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</A>.
<H3><A name="4.21">4.21</A>) Почему имена таблицы и колонок не
распознаются в в моём запросе?</H3>
<P>Наиболее часто это происходит из-за использования двойных кавычек в
имени таблицы или колонки при создании таблицы. При использовании двойных
кавычек, имя таблицы и колонки (которые называют идентификаторами)
сохраняются в <A href="http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS">
регистро-зависимом виде</A>; это означает, что вы должны использовать
двойные кавычки, когда указываете эти имена в запросе. Некоторые
интерфейсы, такие как pgAdmin, во время создания таблицы добавляют
двойные кавычки автоматически. Таким образом, чтобы идентификаторы
распознавались вы должны следовать одному из следующих правил:
<UL>
<LI>Избегать использования двойных кавычек при создании таблиц</LI>
<LI>Использовать в идентификаторах только символы нижнего регистра</LI>
<LI>Использовать двойные кавычки для идентификаторов в запросах</LI>
</UL>
</BODY>
</HTML>