1
<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01 transitional//EN">
4
<!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
7
<META name="generator" content="HTML Tidy, see www.w3.org">
8
<META http-equiv="Content-Type" content="text/html; charset=utf8">
9
<TITLE>PostgreSQL FAQ</TITLE>
12
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000" alink="#0000ff">
13
<H1>Ответы на часто задаваемые вопросы по PostgreSQL</H1>
15
<P>Дата последнего обновления: Среда 25 июня 23:54:14 EDT 2008</P>
17
<P>Английский вариант сопровождает: Брюс Момьян (Bruce Momjian) (<A href=
18
"mailto:bruce@momjian.us">bruce@monjian.us</A>)
20
<P>Перевёл на русский: Виктор Вислобоков (<A href=
21
"mailto:admin@postgresql.ru.net">admin@postgresql.ru.net</A>)<BR>
24
<P>Самую свежую английскую версию документа можно найти на
25
<A href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</A>.</P>
27
<P>Самую свежую русскую версию документа можно найти на
28
<A href="http://postgresql.ru.net/docs/FAQ_russian.html">http://postgresql.ru.net/docs/FAQ_russian.html</A>.</P>
30
<P>Ответы на вопросы специфичные для конкретных платформ можно найти на
31
<A href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</A>.</P>
34
<H2 align="center">Общие вопросы</H2>
35
<A href="#item1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название? Что такое Postgres?<BR>
36
<A href="#item1.2">1.2</A>) Кто управляет PostgreSQL?<BR>
37
<A href="#item1.3">1.3</A>) Каковы авторские права на PostgreSQL?<BR>
38
<A href="#item1.4">1.4</A>) На каких платформах работает PostgreSQL?<BR>
39
<A href="#item1.5">1.5</A>) Где можно взять PostgreSQL?<BR>
40
<A href="#item1.6">1.6</A>) Какая версия наиболее свежая?<BR>
41
<A href="#item1.7">1.7</A>) Где получить поддержку?<BR>
42
<A href="#item1.8">1.8</A>) Как мне сообщить об ошибке?<BR>
43
<A href="#item1.9">1.9</A>) Как найти информацию об известных ошибках или отсутствующих
45
<A href="#item1.10">1.10</A>) Какая документация имеется в наличии?<BR>
46
<A href="#item1.11">1.11</A>) Как научиться <SMALL>SQL</SMALL>?<BR>
47
<A href="#item1.12">1.12</A>) Как мне отправить исправление или присоединится к команде разработчиков?<BR>
48
<A href="#item1.13">1.13</A>) Как сравнить PostgreSQL с другими
49
<SMALL>СУБД</SMALL>? Может ли PostgreSQL быть встроенной?<BR>
50
<A href="#item1.14">1.14</A>) Будет ли PostgreSQL работать с последними изменениями, в разных страных,
51
касающимися дневного времени?<BR>
52
<A href="#item1.15">1.15</A>) Как мне отписаться от списков рассылки PostgreSQL?
53
Как избежать получения дублирующихся сообщений?<BR>
55
<H2 align="center">Вопросы пользователей по клиентской части</H2>
56
<A href="#item2.1">2.1</A>) Какие интерфейсы есть для PostgreSQL?<BR>
57
<A href="#item2.2">2.2</A>) Какие инструменты существуют для использования
58
PostgreSQL через Web?<BR>
59
<A href="#item2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
63
<H2 align="center">Вопросы администрирования</H2>
64
<A href="#item3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
65
от <I>/usr/local/pgsql</I>?<BR>
66
<A href="#item3.2">3.2</A>) Как мне управлять соединениями от других
68
<A href="#item3.3">3.3</A>) Какие настройки мне нужно сделать для улучшения
69
производительности?<BR>
70
<A href="#item3.4">3.4</A>) Какие возможности для отладки есть в наличии?<BR>
71
<A href="#item3.5">3.5</A>) Почему я получаю сообщение <I>"Sorry, too many
72
clients"</I> когда пытаюсь подключиться к базе?<BR>
73
<A href="#item3.6">3.6</A>) Как выполнить обновление PostgreSQL?<BR>
74
<A href="#item3.7">3.7</A>) Какое компьютерное "железо" я должен
78
<H2 align="center">Вопросы эксплуатации</H2>
79
<A href="#item4.1">4.1</A>) Как выполнить <SMALL>SELECT</SMALL> только
80
для нескольких первых строчек запроса? Для произвольной строки?<BR>
81
<A href="#item4.2">4.2</A>) Как мне найти какие таблицы, индексы,
82
базы данных и пользователи существуют? Как мне увидеть запросы,
83
которые использует <I>psql</I> для получения этой информации?<BR>
84
<A href="#item4.3">4.3</A>) Как изменить тип данных колонки?<BR>
85
<A href="#item4.4">4.4</A>) Каковы максимальные размеры для строк в таблице,
86
таблиц и базы данных?<BR>
87
<A href="#item4.5">4.5</A>) Как много дискового пространства в базе данных
88
нужно для сохранения данных из обычного текстового файла?<BR>
89
<A href="#item4.6">4.6</A>) Почему мои запросы работают медлено? Почему
90
они не используют мои индексы?<BR>
91
<A href="#item4.7">4.7</A>) Как посмотреть на то, как оптимизатор выполняет
93
<A href="#item4.8">4.8</A>) Как мне выполнить поиск регулярного выражения
94
и поиск независимый от регистра букв поиск регулярного выражения?
95
Как мне использовать индекс для поиска независимого от регистра букв?<BR>
96
<A href="#item4.9">4.9</A>) Как мне определить, что значение поля в каком-либо
97
запросе равно <SMALL>NULL</SMALL>? Как мне соединить возможные
98
<SMALL>NULL</SMALL>? Могу я сортировать поля <SMALL>NULL</SMALL> или нет?<BR>
99
<A href="#item4.10">4.10</A>) Каковы отличия между разными символьными
101
<A href="#item4.11.1">4.11.1</A>) Как мне создать поле serial/с-авто-увеличением?<BR>
102
<A href="#item4.11.2">4.11.2</A>) Как мне получить значение при вставке
103
<SMALL>SERIAL</SMALL>?<BR>
104
<A href="#item4.11.3">4.11.3</A>) Не может ли получиться так, что
105
использование <I>currval()</I> и <I>nextval()</I> приведет к
106
зациклированию с другими пользователями?<BR>
107
<A href="#item4.11.4">4.11.4</A>) Почему числа из моей последовательности
108
не используются снова при отмене транзакции? Почему создаются разрывы
109
при нумерации в колонке, где я использую последовательность/SERIAL?<BR>
110
<A href="#item4.12">4.12</A>) Что такое <SMALL>OID</SMALL>? Что такое
111
<SMALL>CTID</SMALL>?<BR>
112
<A href="#item4.13">4.13</A>) Почему я получаю ошибку <I>"ERROR: Memory
113
exhausted in AllocSetAlloc()"</I>?<BR>
114
<A href="#item4.14">4.14</A>) Как мне узнать, какая версия PostgreSQL
116
<A href="#item4.15">4.15</A>) Как мне создать колонку которая по умолчанию
117
будет содержать текущее время?<BR>
118
<A href="#item4.16">4.16</A>) Как выполнить внешнее связывание?<BR>
119
<A href="#item4.17">4.17</A>) Как выполнять запросы, использующие несколько
121
<A href="#item4.18">4.18</A>) Как мне вернуть из функции несколько строк таблицы?<BR>
122
<A href="#item4.19">4.19</A>) Почему я получаю ошибку "relation with OID ####
123
не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?<BR>
124
<A href="#item4.20">4.20</A>) Какие есть решения для репликации?<BR>
125
<A href="#item4.21">4.21</A>) Почему имена таблицы и колонок не
126
распознаются в в моём запросе? Почему не сохраняются заглавные буквы?<BR>
130
<H2 align="center">Общие вопросы</H2>
132
<H3><A name="item1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название? Что такое Postgres?</H3>
134
<P>PostgreSQL произносится <I>Post-Gres-Q-L (Пост-Грес-Кью-Эл)</I>.
135
(Для особо любопытствующих как произносить "PostgreSQL", существует
136
<A href="http://www.postgresql.org/files/postgresql.mp3">аудио-файл</A>).
139
<P>PostgreSQL - это объектно-реляционная система управления базами
140
данных (СУБД), которая имеет традиционные возможности коммерческих
141
<small>СУБД</small> с расширениями, которые есть в <small>СУБД</small>
142
нового поколения. PostgreSQL - это свободное и полностью открытое
143
программное обеспечение.</P>
145
<P>Разработку PostgreSQL выполняет команда разработчиков, разбросанная
146
по всему миру и связанная через Интернет. Разработка является
147
общественным проектом и не управляется какой-либо компанией.
148
Подробности смотрите в FAQ для разработчиков,
149
<A href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
150
http://www.postgresql.org/docs/faqs.FAQ_DEV.html</A>
153
<P>Postgres — это широко используемое сокращение для PostgreSQL.
154
Первоначальным именем проекта в Беркли было Postgres и этот ник теперь
155
наиболее популярен в разговорах о PostgreSQL по сравнению с другими.
156
Если вам трудно полностью проговаривать 'PostgreSQL', можно просто
157
говорить 'Postgres'.</P>
159
<H3><A name="item1.2">1.2</A>) Кто управляет PostgreSQL?</H3>
161
<P>Если вы ищите какого-то особенного человека, центральный
162
комитет или управляющую компанию, то напрасно --- их нет.
163
У нас есть ядро комитета и разработчиков, работающих с CVS,
164
но эти группы служат больше для административных целей, чем
165
для управления. Проект напрямую функционирует с помощью
166
сообщества разработчиков и пользователей, к которому может
167
присоединится каждый. Всё что нужно -- это подписаться на
168
списки рассылки и участвовать в дискуссиях. (Подробности о
169
том как включиться в разработку PostgreSQL смотрите в
170
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
171
FAQ для разработчиков</A>.)</P>
173
<H3><A name="item1.3">1.3</A>) Каковы авторские права на PostgreSQL?</H3>
175
<P>PostgreSQL распространяется по классической лицензии BSD. Эта
176
лицензия не содержит ограничений на то, как будет использоваться
177
исходный код. Нам нравится эта лицензия и у нас нет намерений её
178
менять. Вот эта лицензия BSD, которую мы используем:</P>
180
<P>Система Управления Базами Данных PostgreSQL</P>
182
<P>Portions copyright (c) 1996-2008, PostgreSQL Global Development
183
Group Portions Copyright (c) 1994-1996 Regents of the University of
186
<P>Предоставляются права на использование, копирование, изменение
187
и распространение данного программного обеспечения и его документации
188
для любых целей, бесплатно и без подписания какого-либо соглашения,
189
при условии что для каждой копии будут предоставлены данное выше
190
замечание об авторских правах, текущий параграф и два следующих
193
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ
194
ЗА ЛЮБЫЕ ПОВРЕЖДЕНИЯ, ВКЛЮЧАЯ ПОТЕРЮ ДОХОДА, НАНЕСЕННЫЕ ПРЯМЫМ
195
ИЛИ НЕПРЯМЫМ, СПЕЦИАЛЬНЫМ ИЛИ СЛУЧАЙНЫМ ИСПОЛЬЗОВАНИЕМ ДАННОГО
196
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ
197
КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ БЫЛ ИЗВЕЩЕН О ВОЗМОЖНОСТИ ТАКИХ
200
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ СПЕЦИАЛЬНО ОТКАЗЫВАЗЫВАЕТСЯ ПРЕДОСТАВЛЯТЬ
201
ЛЮБЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ТОЛЬКО ЭТИМИ ГАРАНТИЯМИ:
202
НЕЯВНЫЕ ГАРАНТИИ ПРИГОДНОСТИ ТОВАРА ИЛИ ПРИГОДНОСТИ ДЛЯ ОТДЕЛЬНОЙ ЦЕЛИ.
203
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ ПРИЦИПА
204
"КАК ЕСТЬ" И КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ ОБЯЗАН ПРЕДОСТАВЛЯТЬ
205
СОПРОВОЖДЕНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, РАСШИРЕНИЯ ИЛИ ИЗМЕНЕНИЯ.</P>
207
<H3><A name="item1.4">1.4</A>) На каких платформах работает PostgreSQL?</H3>
209
<P>Обычно, PostgreSQL может работать на любой современной платформе
210
совместимой с Unix. В инструкции по установке, вы найдете список
211
тех платформ, на которых были проведены тестовые запуски PostgreSQL
212
к моменту выхода данной версии.</P>
214
<P>PostgreSQL также работает на операционных системах Microsoft
215
Windows, основанных на NT, таких как Win2000 SP4, WinXP и Win2003.
216
Пакет инсталлятора доступен по адресу
217
<A href="http://www.postgresql.org/download/windows">
218
http://www.postgresql.org/download/windows</A>. Версии Windows,
219
основанные на MS-DOS (Win95, Win98, WinMe) могут запускать
220
PostgreSQL с помощью Cygwin.</P>
222
<P>Также существует версия спортированная под Novell Netware 6 на
223
<A href="http://developer.novell.com/wiki/index.php/Postgresql">http://developer.novell.com/wiki/index.php/Postgresql</A>,
224
и версия для OS/2 (eComStation) на
225
<A href="http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F">
226
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F</A>.</P>
228
<H3><A name="item1.5">1.5</A>) Где можно взять PostgreSQL?</H3>
230
<P>Через браузер, используя <a href="http://www.postgresql.org/ftp/">
231
http://www.postgresql.org/ftp/</a> и через ftp, используя
232
<A href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.postgresql.org/pub/</A>.</P>
235
<H3><A name="item1.6">1.6</A>) Какая версия наиболее свежая?</H3>
237
<P>Последний выпуск PostgreSQL - это версия 8.3.3</P>
239
<P>Мы планируем выпускать новые старшие версии каждый год,
240
а младшие версии каждые несколько месяцев.</P>
243
<H3><A name="item1.7">1.7</A>) Где получить поддержку?</H3>
245
<P>Сообщество PostgreSQL предоставляет помощь множеству пользователей
246
через E-mail. Основной web-сайт для подписки на списки рассылки по
247
E-mail это: <A href="http://www.postgresql.org/community/lists/">
248
http://www.postgresql.org/community/lists/</A>. Хорошим местом для
249
того, чтобы начать задавать вопросы являются списки <i>general</i>
250
(общие вопросы) или <i>bugs</i> (ошибки).</P>
252
<P>Главным IRC каналом является <I>#postgreql</I>,
253
расположенный на сервере Freenode (<I>irc.freenode.net</I>). Чтобы
254
подключиться, вы можете использовать в Unix вызов программы
255
<code>irc -c '#postgresql' "$USER" irc.freenode.net</code> или
256
любой другой IRC клиент. На этом же сервере существуют каналы на
257
испанском (<I>#postgresql-es</I>), французском (<I>#postgresqlfr</I>)
258
и бразильском (<I>#postgresql-br</I>) языках. Также существует канал
259
по PostgreSQL на сервере EFNet.</P>
261
<P>Список коммерческой поддержки компаний доступен на
262
<A href="http://www.postgresql.org/support/professional_support">
263
http://www.postgresql.org/support/professional_support</A>.</P>
266
<H3><A name="item1.8">1.8</A>) Как мне сообщить об ошибке?</H3>
268
<P>Посетите страничку со специальной формой отчёта об ошибке в
269
PostgreSQL по адресу:
270
<A HREF="http://www.postgresql.org/support/submitbug">
271
http://www.postgresql.org/support/submitbug</A>.
272
Также проверьте наличие более свежей версии PostgreSQL на нашем
273
FTP сайте <A href="ftp://ftp.postgresql.org/pub/">
274
ftp://ftp.postgresql.org/pub/</A>.</P>
276
<P>На ошибки, уведомление о которых были сделаны через специальную
277
форму или отправленные в какой-либо список рассылки PostgreSQL,
278
обычно генерируется один из следующих ответов:</P>
280
<LI>Это не ошибка и почему</LI>
281
<LI>Это известная ошибка и она уже есть в списке
282
<A HREF="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A></LI>
283
<LI>Данная ошибка была исправлена в текущем выпуске</LI>
284
<LI>Данная ошибка была исправлена, но исправление пока не попало в
285
официальный выпуск</LI>
286
<LI>Запрашивается более детальная информация:
288
<LI>Операционная система</LI>
289
<LI>Версия PostgreSQL</LI>
290
<LI>Тест, воспроизводящий ошибку</LI>
291
<LI>Отладочная информация</LI>
292
<LI>Вывод backtrace отладчика</LI>
295
<LI>Это новая ошибка. Может произойти следующее:
297
<LI>Будет создано исправление, которое будет включено в следующий
299
<LI>Ошибка не может быть исправлена немедленно и будет добавлена в список
300
<A HREF="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A></LI>
305
<H3><A name="1.9">1.9</A>) Как найти информацию об известных ошибках
306
или отсутствующих возможностях?</H3>
308
<P>PostgreSQL поддерживает расширенный подкласс <SMALL>SQL:2003</SMALL>.
309
Смотрите наш список <A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
310
на предмет известных ошибок, отсутствующих возможностей и будущих
313
<P>На запрос какой-либо возможности обычно приходят следующие ответы:</P>
315
<LI>Данная возможность уже есть в списке
316
<A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A></LI>
317
<LI>Данная возможность нежелательна потому что:
319
<LI>Она дублирует существующую функциональность, которая следует
321
<LI>Данная возможность сильно усложнила бы код, но дала бы маленькую
323
<LI>Данная возможность небезопасна или ненадёжна</LI>
326
<LI>Данная новая возможность добавлена в список
327
<A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
331
<P>PostgreSQL не использует какую-либо систему отслеживания ошибок,
332
потому что мы обнаружили, что использование прямого обращения по
333
электронной почте и обновляемого списка
334
<A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
335
является более эффективным. На практике, ошибки в программном
336
обеспечении сохраняются очень недолго, а ошибки, которые важны
337
большому количеству пользователей исправляются моментально. Есть
338
только одно место, где можно найти все изменения, улучшения и
339
исправления, сделанные в выпуске PostgreSQL - это журналы сообщений
340
системы контроля версий
341
<A HREF="http://www.postgresql.org/developer/sourcecode/">CVS</A>.
342
Даже замечания к выпускам не содержат все изменения, сделанные
343
в программном обеспечении.</P>
346
<H3><A name="item1.10">1.10</A>) Какая документация имеется в наличии?</H3>
348
<P>PostgreSQL содержит много документации, включая большое руководство,
349
страницы электронного руководства man и некоторые маленькие тестовые
350
примеры. Смотрите в каталог <I>/doc</I>. Вы также можете просматривать
351
документацию в Интернет по адресу <A href="http://www.postgresql.org/docs">
352
http://www.postgresql.org/docs</A>.</P>
354
<P>Существует две книги по PostgreSQL доступные по адресам <A href=
355
"http://www.PostgreSQL.org/docs/books/awbook.html">http://www.PostgreSQL.org/docs/books/awbook.html</A>
356
и <a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>.
357
Есть несколько книг по PostgreSQL, которые можно купить.
358
Одну из наиболее популярных написал Корри Дуглас (Korry Douglas).
359
Список обзоров по этим книгам доступен по адресу
360
<a href="http://www.postgresql.org/docs/books/">http://www.postgresql.org/docs/books/</a>.
361
Кроме того, по адресу <a href="http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation">http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation</a>
362
вы можете найти коллекцию технических статей, посвещенных PostgreSQL.</P>
364
<P>Клиент командной строки <I>psql</I> имеет несколько команд \d для
365
отображения информации по типам, операторам, функциям, агрегатам и т.д. -
366
используйте \? для получения списка доступных команд.</P>
368
<P>Наш сайт содержит еще больше информации.</P>
371
<H3><A name="item1.11">1.11</A>) Как мне научиться <SMALL>SQL</SMALL>?</H3>
373
<P>Во-первых, возьмите одну из книг по PostgreSQL, о которых говорилось
374
выше. Многим из наших пользователей также нравится книга
375
<I>The Practical SQL Handbook</I>,
376
Bowman, Judith S., et al., Addison-Wesley. Другим нравится <I>The
377
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
379
<P>Существует также множество прекрасных учебников доступных в online:
381
<LI><A href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,</A>
383
<LI><A href="http://sqlcourse.com/">http://sqlcourse.com.</A>
385
<LI><A href="http://www.w3schools.com/sql/default.asp">http://www.w3school.com/sql/default.asp</A>
387
<LI><A href="http://mysite.verizon.net/Graeme_Birchall/id1.html">http://mysite.verizon.net/Graeme_Birchall/id1.html</A>
392
<H3><A name="item1.12">1.12</A>) Как мне прислать исправление или присоединится к команде разработчиков?</H3>
394
<P>Смотрите <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
395
FAQ для разработчиков</A>.</P>
398
<H3><A name="item1.13">1.13</A>) Как сравнить PostgreSQL с другими
399
<SMALL>СУБД</SMALL>? Может ли PostgreSQL быть встроенным?</H3>
402
Существует несколько методов сравнения программного обеспечения:
403
возможности, производительность, надежность, поддержка и цена.</P>
406
<DT><B>Возможности</B></DT>
408
<DD>PostgreSQL имеет большинство возможностей представленных
409
в больших коммерческих <SMALL>СУБД</SMALL>, такие как: транзакции,
410
подзапросы, триггеры, представления, ссылочной
411
целостности вторичного ключа и разные блокировки. У нас есть некоторые возможности,
412
которых нет у них: типы, определяемые пользователем, механизм
413
наследования, правила и конкуретное многоверсионное управление
414
для работы с содержимым блокировок.<BR>
418
<DT><B>Производительность</B></DT>
420
<DD>Производительность PostgreSQL сходна с другими коммерческими
421
СУБД и с СУБД с открытым исходным кодом. В каких-то вещах мы быстрее,
422
в каких-то медленнее. Наша производительности обычно +/-10% по
423
сравнению с другими СУБД.
427
<DT><B>Надежность</B></DT>
429
<DD>Мы понимали, что наша <SMALL>СУБД</SMALL> должна быть надежной
430
или она ничего не будет стоить. Мы стараемся выпускать хорошо проверенный,
431
стабильный код, который содержит минимум ошибок. Каждый выпуск
432
проходит стадию бета-тестирования по крайней мере в течении одного
433
месяца и наша история выпусков показывает что мы можем предоставлять
434
стабильные, монолитные выпуски, которые готовы к продуктивному
435
использованию. Мы верим, что мы производим проверку не хуже,
436
чем у других СУБД.<BR>
440
<DT><B>Поддержка</B></DT>
442
<DD>Наш список рассылки предоставляет возможможность общения с
443
большой группой разработчиков и пользователей, которые могут помочь решить
444
любые возникшие проблемы. В то же время, мы не гарантируем какие-либо
445
исправления, но и разработчики коммерческих <SMALL>СУБД</SMALL> не всегда
446
делают исправления. Прямой доступ к разработчикам, сообществу
447
пользователей, руководствам и исходным текстам часто делают поддержку
448
PostgreSQL превосходящей другие <SMALL>СУБД</SMALL>. Существует
449
коммерческая поддержка по результам возникших инцидентов, которая
450
доступна для тех кому она нужна. (Смотрите <A href="#item1.7">Секцию 1.7</A>.)<BR>
456
<DD>Наш продукт бесплатен как для коммерческого так, и не для
457
коммерческого использования. Вы можете добавлять свой код в наш
458
продукт без ограничений, за исключением тех, что описываются в
459
нашей лицензии стиля BSD, которая приведена выше.<BR>
464
<P>PostgreSQL разрабатывается по архитектуре клиент/сервер, которая
465
требует отдельных процессов для каждого клиента и сервера, а также
466
несколько вспомогательных процессов. Многие встраиваемые архитектуры
467
могут соответствовать таким требованиям. Однако, если ваша встраиваемая
468
архитектура требует сервер баз данных для запуска внутри прикладного
469
процесса, вы не можете использовать Postgres и вам лучше бы выбрать
470
для базы данных какое-либо другое облегченное решение.</P>
472
<H3><A name="item1.14">1.14</A>) Будет ли PostgreSQL работать с
473
последними изменениями, в разных страных, касающимися дневного времени?</H3>
475
<P>Изменения в сохранении дневного времени в США включены в PostgreSQL версии
476
8.0.[4+] и во все следующие выпуски, например в 8.1. Изменения по Канаде
477
и Западной Австралии включены в 8.0.[10+], 8.1.[6+] и все следующие
478
выпуски. Выпуски PostgreSQL до 8.0 используют информацию о сохранении
479
дневного времени из базы данных временных зон в операционной системе.</p>
482
<H3 id="item1.15">1.15) Как мне отписаться от списков рассылки PostgreSQL?
483
Как избежать получения дублирующих сообщений?</H3>
486
href="http://mail.postgresql.org/mj/mj_wwwusr/domain=postgresql.org?user=&passw=&func=login">Majordomo</a>
487
на сайте PostgreSQL позволяет подписаться или отписаться от любого из списков
488
рассылки PostgreSQL. (Вам может понадобится ваш пароль для Majordomo, который
489
отправляется на ваш E-mail, чтобы войти в управление вашими подписками.)</P>
491
<P>Все списки рассылки PostgreSQL настариваются так, чтобы групповой ответ уходил
492
на адрес списка <I>и</I> на адрес автора сообщения. Так сделано, чтобы пользователи
493
получали ответы на E-mail как можно быстрее. Если вы не хотите получать дублирующие
494
E-mail сообщения из списка, в случаях когда вы уже получили эти сообщения напрямую,
495
установите флажок <I>eliminatecc</I> на странице <I>Change Settings</I> в
496
Majordomo. Вы также можете избежать получения копий своих сообщений для самого себя,
497
если снимите флажок <I>selfcopy</I>.</P>
501
<H2 align="center">Вопросы пользователей по клиентской части</H2>
503
<H3><A name="item2.1">2.1</A>) Какие интерфейсы есть для PostgreSQL?</H3>
505
<P>Установка PostgreSQL включает только <small>C</small> и встроенный
506
(embedded) <small>C</small> интерфейсы. Все другие интерфейсы
507
являются независимыми проектами и загружаются отдельно; самостоятельность
508
проектов позволяет им организовать собственное расписание выпусков
509
новых версий и иметь собственную команду разработчиков.</P>
511
<P>Некоторые языки программирования, такие как <small>PHP</small>
512
включают в себя интерфейс к PostgreSQL. Интерфейсы для таких языков
513
как Perl, <small>TCL</small>, Python и многих других, доступны на
514
<a href="http://pgfoundry.org">http://pgfoundry.org</A>.</P>
516
<H3><A name="item2.2">2.2</A>) Какие инструменты существуют для использования
517
PostgreSQL через Web?</H3>
519
<P>Прекрасное введение во взаимодействие баз данных и Web можно найти на:
520
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
522
<P>Для интеграции с Web, PHP <A href="http://www.php.net">
523
http://www.php.net</A> является неплохим интерфейсом.</P>
525
<P>В сложных случаях, многие пользуются Perl и DBD::Pg с CGI.pm
528
<H3><A name="item2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
531
<P>Для PostgreSQL существует большое количество инструментов с
532
графическим интерфейсом как коммерческих, так и открытых. Подробности
533
можно найти в <A href="http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools">
534
Документации сообщества для GUI иструментов PostgreSQL</A></P>
538
<H2 align="center">Вопросы администрирования</H2>
540
<H3><A name="item3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
541
от <I>/usr/local/pgsql</I>?</H3>
543
<P>Задайте опцию <I>--prefix</I> когда запускаете <I>configure</I>.</P>
545
<H3><A name="item3.2">3.2</A>) Как мне управлять соединениями от других
548
<P>По умолчанию, PostgreSQL разрешает только соединения на локальной
549
машине через сокеты домена Unix или TCP/IP соединения. Для того, чтобы
550
другие машины смогли подключиться к базе вы должны изменить
551
<I>listen_addresses</I> в <I>postgresql.conf</I>, разрешить
552
host-авторизация в файле <I>$PGDATA/pg_hba.conf</I> и перестартовать
555
<H3><A name="item3.3">3.3</A>) Какие настройки мне нужно сделать для улучшения
556
производительности?</H3>
558
<P>Существует три главных области, которые потенциально могут
559
увеличить производительность:</P>
562
<DT><B>Изменение запроса</B></DT>
563
<DD>Это означает модификацию запросов для получения лучшей
566
<LI>Создание индексов, включая индексы выражений и частичные индексы</LI>
567
<LI>Использование COPY вместо множества <small>INSERT</small></LI>
568
<LI>Группировка нескольких операторов в единую транзакцию для
569
уменьшения нагрузки при выполнении завершения транзакции</LI>
570
<LI>Использование <small>CLUSTER</small>, когда из индекса берётся
572
<LI>Использование <small>LIMIT</small> для того, чтобы возвращалась
573
только часть вывода от запроса</LI>
574
<LI>Использование Подготовленных (Prepared) запросов</LI>
575
<LI>Использование <small>ANALYZE</small> для обслуживания статистики
577
<LI>Регулярное использование <small>VACUUM</small> или <I>pg_autovacuum</I></LI>
578
<LI>Удаление индексов во время больших изменений данных</LI>
583
<DT><B>Настройка сервера</B></DT>
585
<DD>Некоторые установки в <I>postgresql.conf</I> влияют на
586
производительность. Подробный полный список установок см. в
587
<A href="http://www.postgresql.org/docs/current/static/runtime-config.html">
588
Administration Guide/Server Run-time Environment/Run-time Configuration</A>,
589
а комментарии см. в <A href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">
590
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</A>
591
и <A href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">
592
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</A>.
596
<DT><B>Выбор "железа" - аппаратного обеспечения</B></DT>
598
<DD>Влияние "железа" на производительность подробно описано в
599
<A href="http://www.powerpostgresql.com/PerfList/">
600
http://www.powerpostgresql.com/PerfList/</A> и
601
<A href="http://momjian.us/main/writings/pgsql/hw_performance/index.html">
602
http://momjian.us/main/writings/pgsql/hw_performance/index.html</A>.
608
<H3><A name="item3.4">3.4</A>) Какие возможности для отладки есть в
611
<P>Есть множество установок в настройках сервера, начинающихся
612
на <code>log_*</code> на <a
613
href="http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html">http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html</a>,
614
позволяющих протоколировать запросы и статистику работы процесса,
615
которая очень полезна для отладки и измерения производительности.</P>
618
<H3><A name="item3.5">3.5</A>) Почему я получаю сообщение <I>"Sorry, too
619
many clients"</I> когда пытаюсь подключиться к базе?</H3>
621
<P>Вы достигли установленного по умолчанию ограничения в 100 сессий
622
подключения к базе данных. Вам необходимо увеличить лимит на количество
623
конкурентных backend процессов для вашего сервера БД,
624
изменив значение <I>max_connections</I> в файле <I>postgresql.conf</I>
625
и перестартовать сервер БД.</P>
628
<H3><A name="item3.6">3.6</A>) Как выполнить обновление PostgreSQL?</H3>
630
<P>См. информацию об обновлении в <a
631
href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>
632
и специальные инструкции в <a href="http://www.postgresql.org/docs/current/static/install-upgrading.html">
633
http://www.postgresql.org/docs/current/static/install-upgrading.html</a>.</P>
636
<H3><A name="item3.7">3.7</A>) Какое компьютерное "железо" я должен
639
<P>Поскольку "железо" персональных компьютеров является наиболее
640
совместимым, люди склонны верить, что такое "железо" имеет одинаковое
641
качество. Это не так. Память ECC, SCSI и качественные материнские платы
642
являются более надёжными и имеют более лучшую производительность, чем
643
менее дорогое "железо". PostgreSQL будет работать на любом "железе",
644
но если для вас важны надёжность и производительность, то с вашей стороны
645
будет мудро поставить соответствующее "железо". Обсудить разное "железо"
646
можно в наших списках рассылки.</P>
650
<H2 align="center">Вопросы эксплуатации</H2>
652
<H3><A name="item4.1">4.1</A>) Как выполнить <SMALL>SELECT</SMALL> только
653
для нескольких первых строчек запроса? Произвольной строки?</H3>
655
<P>Для получения только нескольких строк, если вы знаете их количество
656
на момент выполнения <SMALL>SELECT</SMALL> используйте <SMALL>LIMIT</SMALL>.</P>
657
Если есть какой-либо индекс, который совпадает с <SMALL>ORDER BY</SMALL>,
658
то возможно, что весь запрос выполнен и не будет. Если вы не знаете
659
количества необходимых строк на момент выполнения <SMALL>SELECT</SMALL>,
660
используйте курсор и <SMALL>FETCH</SMALL>.</P>
662
<P>To <small>SELECT</small> a random row, use:</P>
670
<H3><A name="item4.2">4.2</A>) Как мне найти какие таблицы, индексы,
671
базы данных и пользователи существуют? Как мне увидеть запросы,
672
которые использует <I>psql</I> для получения этой информации?</H3>
674
<P>Чтобы просматривать таблицы в <I>psql</I>, используйте команду \dt.
675
Полный список команд в <I>psql</I> вы можете получить, используя \?.
676
Кроме того, вы можете посмотреть исходный код <I>psql</I> в файле
677
<I>pgsql/src/bin/psql/describe.c</I>. Он содержит команды
678
<SMALL>SQL</SMALL> которые генерируются при вводе в <I>psql</I> команд,
679
начинающихся с обратной косой черты. Вы также можете запустить
680
<I>psql</I> с опцией <I>-E</I> так, чтобы эта программа выдавала
681
запросы, которые она использует для выполнения заданных вами
682
команд. PostgreSQL также предоставляет <SMALL>SQL</SMALL>
683
совместимый с INFORMATION SCHEMA интерфейс, с помощью которого, вы
684
можете сформировать запрос на получение информации о базе данных.</P>
686
<P>Также существуют системные таблицы, начинающиеся с <I>pg_</I>.</P>
688
<P>Используйте <I>psql -l</I> для получения списка всех баз данных.</P>
690
<P>Также посмотрите файл <I>pgsql/src/tutorial/syscat.source</I>.
691
Он показывает многие из операторов <SMALL>SELECT</SMALL> необходимых
692
для получения информации из системных таблиц базы данных.</P>
695
<H3><A name="item4.3">4.3</A>) Как изменить тип данных колонки?</H3>
697
<P>В 8.0 и более поздних версиях, изменение типа колонки выполняется
698
очень легко через <SMALL>ALTER TABLE ALTER COLUMN TYPE</SMALL>.</P>
700
<P>В более ранних версиях сделайте так:</P>
703
ALTER TABLE tab ADD COLUMN new_col <i>new_data_type</i>;
704
UPDATE tab SET new_col = CAST(old_col AS <i>new_data_type</i>);
705
ALTER TABLE tab DROP COLUMN old_col;
709
<H3><A name="item4.4">4.4</A>) Каковы максимальные размеры для строк в таблице,
710
таблиц и базы данных?</H3>
712
<P>Существуют следующие ограничения:</P>
716
<TD>Максимальный размер базы?</TD>
717
<TD>неограничен (существуют базы на 32 TB)</TD>
720
<TD>Максимальный размер таблицы?</TD>
724
<TD>Максимальный размер строки?</TD>
728
<TD>Максимальный размер поля?</TD>
732
<TD>Максимальное количество строк в таблице?</TD>
733
<TD>неограничено</TD>
736
<TD>Максимальное количество колонок в таблице?</TD>
737
<TD>250-1600 в зависимости от типа</TD>
740
<TD>Максимальное количество индексов в таблице?</TD>
741
<TD>неограничено</TD>
746
<P>Разумеется, понятие "неограничено" на самом деле ограничивается
747
доступным дисковым пространиством и размерами памяти/своппинга.
748
Когда значения перечисленные выше неоправдано большие, может
749
пострадать производительность.</P>
751
<P>Максимальный размер таблицы в 32 TB не требует чтобы операционная
752
система поддерживала файлы больших размеров. Большие таблицы хранятся
753
как множество файлов размером в 1 GB, так что ограничения, которые
754
накладывает файловая система не важны.</P>
756
<P>Максимальный размер таблицы и максимальное количество колонок
757
могут быть увеличены в четыре раза, если размер блока по умолчанию будет
760
<P>Существует ограничение, по которому индексы не могут создаваться для
761
колонок длиннее чем 2,000 символов. К счастью такие индексы вряд ли
762
действительно кому-то нужны. Уникальность гарантируется наилучим образом,
763
с помощью функционального индекса из хэша MD5 длинной колонки, а
764
полнотекстовое индексирование позволяет искать слова внутри колонки.</P>
766
<H3><A name="item4.5">4.5</A>) Как много дискового пространства в базе данных
767
нужно для сохранения данных из обычного текстового файла?</H3>
769
<P>СУБД PostgreSQL может потребоваться дискового пространства до 5 раз
770
больше для сохранения данных из простого текстового файла.</P>
772
<P>В качестве примера, рассмотрим файл в 100,000 строк в каждой, из
773
которых целое число и текстовое описание. При этом длина текста,
774
в среднем, составляет 20 байт. Размер простого файла составит 2.8 MB.
775
Размер базы PostgreSQL, содержащей эти же данные составит приблизительно
776
5.2 MB из которых:</P>
778
24 байт: на каждый заголовок строки в таблице (приблизительно)
779
+ 24 байта: одно поле с целочисленным типом и одно текстовое поле
780
+ 4 байта: указатель на странице для всей табличной строки
781
----------------------------------------
782
56 байт на строку в таблице
784
Размер страницы данных в PostgreSQL составляет 8192 байт (8 KB), так что:
786
8192 байт на страницу
787
--------------------- = 158 строк в таблице на страницу БД (округлённо)
788
52 байт на строку в таблице
791
----------------------- = 633 страниц в БД (округлённо)
792
158 строк в таблице на страницу
794
633 страниц БД * 8192 байт на страницу = 5,185,536 байт (5.2 MB)
797
<P>Индексы не требуют так много, но поскольку они создаются для
798
большого количества данных, они также могут быть велики.</P>
800
<P>Значения <small>NULL</small> хранятся как битовые карты и поэтому они
801
занимают очень мало места.
804
<H3><A name="item4.6">4.6</A>) Почему мои запросы работают медлено? Почему
805
они не используют мои индексы?</H3>
807
<P>Индексы не используются для каждого запроса. Они
808
используются только если таблица больше минимального размера и запрос
809
выбирает только маленький процент строк в таблице. Так устроено,
810
потому что доступ к диску с применением рандомизации при сканировании
811
индексов может быть медленнее, чем простое чтение таблицы или ее
812
последовательное сканирование.</P>
814
<P>Чтобы определить необходимость использования индекса для какой-либо
815
таблицы, PostgreSQL должен иметь статистику по этой таблице. Эта
816
статистика собирается при использовании <SMALL>VACUUM ANALYZE</SMALL>
817
или просто <SMALL>ANALYZE</SMALL>. Используя статистику, оптимизатор
818
узнает о том как много строк в таблице и если он должен использовать
819
индексы, то он может принимать лучшие решения. Статистика также
820
влияет на определение оптимального порядка связывания и метода связывания.
821
При изменении содержимого таблицы должен периодически выполнятся
824
<P>Обычно индексы не используются для <SMALL>ORDER BY</SMALL> или для
825
выполнения связываний. Последовательный перебор следующий за явной
826
сортировкой обычно быстрее, чем поиск по индексам в большой таблице.
827
Однако, <SMALL>ORDER BY</SMALL> часто комбинируется с <SMALL>LIMIT</SMALL>
828
и в этом случае индекс будет использоваться, поскольку при выполнении
829
будет возвращаться небольшая часть таблицы.</P>
831
<P>Если вам кажется, что оптимизатор некорректно выбирает последовательный
832
перебор, используйте <CODE>SET enable_seqscan TO 'off'</CODE> и
833
запустите запрос снова, чтобы увидеть, действительно ли сканирование
837
<P>Когда используются операции с шаблонами, например <SMALL>LIKE</SMALL>
838
или <I>~</I>, индексы могут быть использованы в следующих случаях:</P>
840
<LI>Начало строки поиска должно совпадать с началом искомой строки, т.е.:
842
<LI><small>LIKE</small> шаблоны не должны начинаться с <i>%.</i>.</LI>
843
<LI><i>~</i> шаблоны регулярных выражений должна начинаться на <i>^</i>.</LI>
845
<LI>Строка поиска не должна начинаться с символа класса, т.е. [a-e].</LI>
846
<LI>Поиск независимый от регистра, такой как <small>ILIKE</small> и
847
<i>~*</i> не использует индексы. Вместо него, используйте индексы
848
выражений, которые описываются в секции <A href="#item4.8">4.8</A>.</LI>
849
<LI>Во время <i>initdb</i> должна использоваться локаль по умолчанию
850
<i>C</i>, потому что не существует возможности узнать следующий наибольший
851
символ для не-C локали. Вы можете для таких случаев создать специальный
852
индекс <CODE>text_pattern_ops</CODE> который работает только для
853
<SMALL>LIKE</SMALL> индексирования. Для поиска слов также можно
854
использовать полнотекстовый индекс.</LI>
857
<H3><A name="item4.7">4.7</A>) Как посмотреть на то, как оптимизатор выполняет
860
<P>Смотрите страницу руководства посвященную <SMALL>EXPLAIN</SMALL>.</P>
863
<H3><A name="item4.8">4.8</A>) Как мне выполнить поиск регулярного выражения
864
и поиск независимый от регистра букв поиск регулярного выражения?
865
Как мне использовать индекс для поиска независимого от регистра букв?</H3>
867
<P>Оператор <I>~</I> производит поиск регулярного выражения, а оператор
868
<I>~*</I> производит независимый от регистра букв поиск регулярного
869
выражения. Независимый от регистра вариант <SMALL>LIKE</SMALL> называется
870
<SMALL>ILIKE</SMALL>.</P>
872
<P>Независимое от регистра сравнение обычно выражается так:</P>
876
WHERE lower(col) = 'abc';
879
Эта конструкция не будет использовать стандартный индекс. Однако, если
880
вы создадите индекс выражения, он будет использован:
882
CREATE INDEX tabindex ON tab (lower(col));
884
<P>Если вышеуказанный индекс создаётся как <SMALL>UNIQUE</SMALL>, то
885
колонка, для которой он создаётся может хранить символы и в верхнем,
886
и в нижнем регистре, индес не может иметь идентичных значений, которые
887
отличаются только регистром. Чтобы в колонке можно было хранить символы
888
только в определённом регистре, используйте ограничение
889
<SMALL>CHECK</SMALL> или проверку через триггер.</P>
891
<H3><A name="item4.9">4.9</A>) Как мне определить, что значение поля в каком-либо
892
запросе равно <SMALL>NULL</SMALL>? Как мне соединить возможные
893
<SMALL>NULL</SMALL>? Могу я сортировать поля <SMALL>NULL</SMALL> или нет?</H3>
895
<P>Вы просто сравниваете значение с <SMALL>IS NULL</SMALL> и
896
<SMALL>IS NOT NULL</SMALL>, как здесь:</P>
903
<P>Чтобы соединить с возможными значениями <SMALL>NULL</SMALL>, используйте
904
<I>COALESCE()</I> как здесь:</P>
906
SELECT COALESCE(col1, '') || COALESCE(col2, '')
910
<P>Чтобы отсортировать данные по значению <NULL> используйте модификаторы
911
<SMALL>IS NULL</SMALL> и <SMALL>IS NOT NULL</SMALL> в выражении
912
<SMALL>ORDER BY</SMALL>. Когда они будут генерировать значения
913
<I>истина</I>, то при сортировке они будут выше, чем значения
914
<I>ложь</I>, так что записи с NULL будут в отсортированном списке сверху:</P>
919
ORDER BY (col IS NOT NULL);
922
<H3><A name="item4.10">4.10</A>) Каковы отличия между разными символьными
928
<TH>Внутреннее имя</TH>
934
<TD>размер задает максимальную длину, нет заполнения</TD>
939
<TD>заполняется пустотой до фиксированной длины</TD>
944
<TD>нет задаваемого верхнего ограничения или длины</TD>
949
<TD>массив байт переменной длины (можно использовать null-байт без опаски)</TD>
959
<P>Внутреннее имя вы можете увидеть, когда смотрите системные каталоги
960
и в некоторых сообщениях об ошибках.</P>
962
<P>Первые четыре типа являются "varlena" типами (т.е., первые
963
четыре байта на диске являются длинной, за которой следуют данные).
964
Таким образом, фактически используемое пространство больше, чем
965
обозначенный размер. Однако, длинные значения также сжимаются,
966
так что занимаемое дисковое пространство может также быть и меньше,
969
<SMALL>VARCHAR(n)</SMALL> - это лучшее решение, когда нужно хранить
970
строки переменной длины, не превышающие определенного размера.
971
<SMALL>TEXT</SMALL> - это лучшее решение для строк неограниченной длины,
972
с максимально допустимой длиной в 1 гигабайт.
973
<P><SMALL>CHAR(n)</SMALL> - это лучшее решение для хранения строк, которые
974
обычно имеют одинаковую длину. <SMALL>CHAR(n)</SMALL> заполняется
975
пустотой до заданной длины, в то время как <SMALL>VARCHAR(n)</SMALL>
976
хранит только символы, из которых состоит строка.
977
<SMALL>BYTEA</SMALL> используется для хранения бинарных данных, значения
978
которых могут включать <SMALL>NULL</SMALL> байты. Все типы описанные
979
здесь, имеют сходные характеристики производительности.</P>
981
<H3><A name="item4.11.1">4.11.1</A>) Как мне создать поле
982
serial/с-авто-увеличением?</H3>
984
<P>PostgreSQL поддерживает тип данных <SMALL>SERIAL</SMALL>. Он
985
автоматически создает последовательность. Например:</P>
987
CREATE TABLE person (
993
автоматически транслируется в:
995
CREATE SEQUENCE person_id_seq;
996
CREATE TABLE person (
997
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
1002
<P>Автоматически созданная последовательность имеет имя вида
1003
<<I>таблица</I>>_<<I>колонка_serial</I>>_<I>seq</I>, где
1004
<I>таблица</I> и <I>колонка_serial</I> - это соответственно имена
1005
таблицы и колонки с типом <SMALL>SERIAL</SMALL>.
1006
Смотрите подробности о последовательностях на странице руководства
1007
посвященной <I>create_sequence</I>.</P>
1009
<H3><A name="item4.11.2">4.11.2</A>) Как мне получить значение при вставке
1010
<SMALL>SERIAL</SMALL>?</H3>
1012
<P>Простейший способ получить назначенное значение <SMALL>SERIAL</SMALL>
1013
это использовать <SMALL>RETURNING</SMALL>. Используя для примера таблицу в <A
1014
href="#item4.11.1">4.11.1</A>, это может выглядеть так:</P>
1017
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
1020
Вы также можете вызвать <I>nextval()</I> и использовать это значение в
1021
<SMALL>INSERT</SMALL> или вызвать <I>currval()</I> <I>после</I>
1022
<SMALL>INSERT</SMALL>.
1025
<H3><A name="item4.11.3">4.11.3</A>) Не может ли получиться так, что
1026
использование <I>currval()</I> и <I>nextval()</I> приведет к
1027
зациклированию с другими пользователями?</H3>
1029
<P>Нет. <i>currval()</i> возвращает текущее значение, назначенное вашей
1030
сессией, а не другими сессиями.</P>
1032
<H3><A name="item4.11.4">4.11.4</A>) Почему числа из моей последовательности
1033
не используются снова при отмене транзакции? Почему создаются разрывы
1034
при нумерации в колонке, где я использую последовательность/SERIAL?</H3>
1036
<P>Для реализации конкуретности, значения последовательностей, при
1037
необходимости выдаются во время запуска транзакций и не блокируются
1038
до полного выполнения транзакций. Это может вызывать разрывы в
1039
нумерации при отмене транзакций.</P>
1042
<H3><A name="item4.12">4.12</A>) Что такое <SMALL>OID</SMALL>? Что такое
1043
<SMALL>CTID</SMALL>?</H3>
1045
<P>Если таблица создана с <SMALL>WITH OIDS</SMALL>, то каждая строка
1046
получает уникальный индентификатор <SMALL>OID</SMALL>.
1047
O<SMALL>ID</SMALL> - это автоматически назначаемое уникальное 4-х
1048
байтовое целое число, которое уникально для всей установленной СУБД.
1049
Однако, после того как его значение превысит 4 миллиарда, значения
1050
O<SMALL>ID</SMALL> начинают дублироваться. PostgreSQL использует
1051
<SMALL>OID</SMALL> для связывания своих внутренних таблиц.</P>
1053
<P>Для уникального значения в строках таблицы пользователя, лучшим
1054
способом является использование <SMALL>SERIAL</SMALL> вместо
1055
O<SMALL>ID</SMALL>, потому что последовательности <SMALL>SERIAL</SMALL>
1056
уникальны только внутри таблицы и таким образом меньше подвержены
1057
переполнению. Для хранения значений 8-ми байтной последовательности
1058
доступен тип <SMALL>SERIAL8</SMALL>.
1060
<P>C<SMALL>TID</SMALL> используется для идентификации специальных
1061
физических записей с блочными и offset значениями. C<SMALL>TID</SMALL>
1062
изменяется после того как строки в таблице были изменены или перегружены.
1063
<P>T<SMALL>ID</SMALL> используется индексными записями в качестве
1064
указателя на физические записи.</P>
1067
<H3><A name="item4.13">4.13</A>) Почему я получаю ошибку <I>"ERROR: Memory
1068
exhausted in AllocSetAlloc()"</I>?</H3>
1070
<P>Предположительно у вас закончилась виртуальная память
1071
или что ваше ядро имеет маленький лимит на определенные ресурсы.
1072
Попытайтесь перед запуском сервера БД выполнить следующие
1079
В зависимости от командного интерпретатора shell, только одна из данных
1080
команд выполнится успешно, но она позволит вам установить больший
1081
сегмент данных процесса и возможно решит проблему. Эта команда
1082
изменяет параметры текущего процесса и всех его потомков, созданных
1083
после её запуска. Если у вас возникла проблема с <SMALL>SQL</SMALL>
1084
клиентом, потому что backend возвращает слишком большой объем данных,
1085
попытайтесь выполнить эту команду перед запуском клиента.
1087
<H3><A name="item4.14">4.14</A>) Как мне узнать, какая версия PostgreSQL
1090
<P>Из <I>psql</I>, наберите <CODE>SELECT version();</CODE></P>
1093
<H3><A name="item4.15">4.15</A>) Как мне создать колонку которая по умолчанию
1094
будет содержать текущее время?</H3>
1096
<P>Используйте <I>CURRENT_TIMESTAMP</I>:</P>
1098
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
1101
<H3><A name="item4.16">4.16</A>) Как мне выполнить внешнее связывание?</H3>
1103
<P>PostgreSQL поддерживает внешнее связывание,
1104
используя стандартный синтаксис SQL. Вот два примера:</P>
1107
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
1113
FROM t1 LEFT OUTER JOIN t2 USING (col);
1116
<P>Это идентичные запросы связывания t1.col и t2.col, также возвращают
1117
любые несвязанные строки в t1 (которые не совпадают с t2).
1118
<SMALL>RIGHT</SMALL> связывание должно добавить несвязанные строки
1119
t2. <SMALL>FULL</SMALL> связывание должно возвратить совпавшие
1120
строки плюс все несвязанные строки из t1 и t2. Слово <SMALL>OUTER</SMALL>
1121
является необязательным и назначается в <SMALL>LEFT</SMALL>,
1122
<SMALL>RIGHT</SMALL> и <SMALL>FULL</SMALL> связываниях. Обычные
1123
связывания называются <SMALL>INNER</SMALL> связывания.</P>
1125
<H3><A name="item4.17">4.17</A>) Как выполнять запросы, использующие несколько
1128
<P>Не существует способа создать запрос к базам данных отличным от текущей.
1129
Поскольку PostgreSQL загружает системные каталоги специфичные для базы
1130
данных, непонятно даже, как должен себя вести такой межбазовый запрос.</P>
1132
<P><I>contrib/dblink</I> позволяет запросы между базами, используя
1133
вызовы функций. Разумеется, клиент может одновременно также устанавливать
1134
соедиенения с различными базами данных и таких образом объединять
1135
информацию из них.</P>
1137
<H3><A name="item4.18">4.18</A>) Как мне вернуть из функции несколько строк таблицы?</H3>
1139
<P>Вы можете легко использовать функции, возвращающие список,
1140
<a href="http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions">
1141
http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions</a>.</P>
1143
<H3><A name="item4.19">4.19</A>) Почему я получаю ошибку "relation with OID ####
1144
не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?</H3>
1146
<P>В PostgreSQL до версии 8.3, PL/PgSQL кэширует сценарии функции и один из
1147
негативных эффектов этого состоит в том, что если функция PL/PgSQL обращается
1148
к временной таблице и эта таблица позднее удаляется и пересоздается, а функция
1149
затем вызывается снова, то ее вызов приведет к ошибке, потому что скэшированное
1150
содержимое функции содержит указатель на старую временную таблицу. Чтобы решить
1151
эту проблему, используйте <SMALL>EXECUTE</SMALL> для доступа к временным
1152
таблицам в PL/PgSQL. Использование этого оператора заставит запрос
1153
перегенерироваться каждый раз.</P>
1155
<P>В PostgreSQL 8.3 и позднее, этой проблемы нет.</p>
1158
<H3><A name="item4.20">4.20</a>) Какие есть решения для репликации?</H3>
1160
<P>Хотя "репликация" -- это единый термин, есть несколько разных технологий
1161
для выполнения репликаций с разными особенностями для каждой.</P>
1163
<P>Репликация Master/slave позволяет иметь один главный (master) сервер
1164
для выполнения запросов чтения/записи, в то время как подчинённые
1165
(slave) сервера могут производить только запросы
1166
чтения/<SMALL>SELECT</SMALL>. Наиболее популярным решением для репликации
1167
master-slave в PostgreSQL является
1168
<A href="http://main.slony.info/">
1171
<P>Репликация Multi-master позволяет выполнять запросы чтения/записи
1172
на нескольких, реплицируемых друг с другом компьюетрах. Эта особенность
1173
также приводит к потере производительности, потому что необходима
1174
синхронизация изменений между несколькими серверами. Наиболее
1175
популярным решением для такой репликации в PostgreSQL является
1176
<A href="http://pgfoundry.org/projects/pgcluster/">PGcluster</A>.
1178
<H3><A name="item4.21">4.21</A>) Почему имена таблицы и колонок не
1179
распознаются в в моём запросе? Почему не сохраняются заглавные буквы?</H3>
1181
<P>Наиболее часто имена нераспознаются из-за использования двойных кавычек в
1182
имени таблицы или колонки при создании таблицы. При использовании двойных
1183
кавычек, имя таблицы и колонки (которые называют идентификаторами)
1184
сохраняются в <A href="http://www.postgresql.org/docs/current/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS">
1185
регистро-зависимом виде</A>; это означает, что вы должны использовать
1186
двойные кавычки, когда указываете эти имена в запросе. Некоторые
1187
интерфейсы, такие как pgAdmin, во время создания таблицы добавляют
1188
двойные кавычки автоматически. Таким образом, чтобы идентификаторы
1189
распознавались вы должны следовать одному из следующих правил:
1191
<LI>Избегать использования двойных кавычек при создании таблиц</LI>
1192
<LI>Использовать в идентификаторах только символы нижнего регистра</LI>
1193
<LI>Использовать двойные кавычки для идентификаторов в запросах</LI>