mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
1111 lines
49 KiB
HTML
1111 lines
49 KiB
HTML
<!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&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F">
|
||
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&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>
|
||
будет <<I>table</I>>_<<I>serialcolumn</I>>_<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>
|