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