From 1bdec3424bc15a3b0d25b4579870ae05824a63ca Mon Sep 17 00:00:00 2001
From: Bruce Momjian Дата последнего обновления: Понедельник 14 февраля 23:35:09 EST 2005 Дата последнего обновления: Понедельник 30 мая 09:11:03 EDT 2005 Английский вариант сопровождает: Брюс Момьян (Bruce Momjian) (pgman@candle.pha.pa.us) Перевел на русский: Виктор Вислобоков (Перевёл на русский: Виктор Вислобоков (corochoone@perm.ru) PostgreSQL произносится Post-Gres-Q-L (Пост-Грес-Кью-Эл),
также часто говорят просто Postgres.Ответы на часто задаваемые вопросы по PostgreSQL
-
1.12) Как сравнивать PostgreSQL с другими
СУБД?
+ 1.13) Кто управляет PostgreSQL?
Вопросы пользователей по клиентской части
@@ -87,8 +88,9 @@
4.8) Как мне выполнить поиск регулярного выражения
и поиск независимый от регистра букв поиск регулярного выражения?
Как мне использовать индекс для поиска независимого от регистра букв?
- 4.9) Как я могу определить, что значение поля равно
- NULL в каком-либо запросе?
+ 4.9) Как мне определить, что значение поля равно
+ NULL в каком-либо запросе? Могу я отсортировать поля
+ NULL или нет?
4.10) Каковы отличия между разными символьными
типами?
4.11.1) Как мне создать поле serial/с-авто-увеличением?
@@ -101,38 +103,26 @@
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?
4.12) Что такое OID? Что такое
- TID?
+ CTID?
4.13) Почему я получаю ошибку "ERROR: Memory
exhausted in AllocSetAlloc()"?
4.14) Как мне узнать, какая версия PostgreSQL
запущена?
- 4.15) Почему при работе с моим большим объектом
- я получаю ошибку "invalid large obj descriptor"?
- 4.16) Как мне создать колонку которая по умолчанию
+ 4.15) Как мне создать колонку которая по умолчанию
будет содержать текущее время?
- 4.17) Как выполнить внешнее связывание?
- 4.18) Как выполнять запросы, использующие несколько
+ 4.16) Как выполнить внешнее связывание?
+ 4.17) Как выполнять запросы, использующие несколько
баз данных?
- 4.19) Как мне вернуть из функции несколько строк таблицы?
- 4.20) Почему я получаю ошибку "missing oid",
- когда обращаютсь к временным таблицам в функциях PL/PgSQL?
- 4.21) Какие опции шифрования существуют?
-
- Расширения PostgreSQL
- 5.1) Я написал функцию определяемую пользователем.
- Когда я запускаю ее в psql, почему я получаю core dump?
- 5.2) Как я могу внести некоторые классные новые
- типы и функции в PostgreSQL?
- 5.3) Как мне написать C функцию, возвращающую
- строку таблицы?
- 5.4) Я изменил исходный файл. Почему после
- перекомпиляции я не вижу изменений?
-
+ 4.18) Как мне вернуть из функции несколько строк таблицы?
+ 4.19) Почему я получаю ошибку "relation with OID ####
+ не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?
+ 4.20) Какие есть решения для репликации?
+
Общие вопросы
- 1.1) Что такое PostgreSQL? Как произносится это название?
+ 1.1) Что такое PostgreSQL? Как произносится это название?
PostgreSQL распространяется по классической лицензии BSD. Эта лицензия не содержит ограничений на то, как будет использоваться @@ -163,7 +153,7 @@
Система Управления Базами Данных PostgreSQL
Portions copyright (c) 1996-2005, PostgreSQL Global Development - Group Portions Copyright (c) 1994-6 Regents of the University of + Group Portions Copyright (c) 1994-1996 Regents of the University of California
Предоставляются права на использование, копирование, изменение @@ -187,16 +177,16 @@ "КАК ЕСТЬ" И КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ ОБЯЗАН ПРЕДОСТАВЛЯТЬ СОПРОВОЖДЕНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, РАСШИРЕНИЯ ИЛИ ИЗМЕНЕНИЯ.
-Обычно, PostgreSQL может работать на любой современной платформе совместимой с Unix. В инструкции по установке, вы найдете список тех платформ, на которых были проведены тестовые запуски PostgreSQL к моменту выхода данной версии.
-Начиная с версии 8.0, PostgreSQL без всяких ухищрений работает на - операционных системах Microsoft Windows, основанных на NT, таких как - Win2000, WinXP и Win2003. Пакет инсталлятора доступен по адресу +
PostgreSQL также работает на операционных системах Microsoft + Windows, основанных на NT, таких как Win2000, WinXP и Win2003. + Пакет инсталлятора доступен по адресу http://pgfoundry.org/projects/pginstaller. Версии Windows, основанные на MS-DOS (Win95, Win98, WinMe) могут запускать @@ -208,14 +198,13 @@ http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F.
-Например, воспользовавшись анонимным доступом на ftp сайт - PostgreSQL ftp://ftp.PostgreSQL.org/pub. - Список зеркал вы найдете на нашем основном сайте.
+Через браузер, используя + http://www.postgresql.org/ftp/ и через ftp, используя + ftp://ftp.PostgreSQL.org/pub/.
-Сообщество PostgreSQL предоставляет помощь множеству пользователей через E-mail. Основной web-сайт для подписки на списки рассылки по @@ -233,28 +222,30 @@ языках. Также существует канал по PostgreSQL на сервере EFNet.
Список коммерческой поддержки компаний доступен на - http://techdocs.postgresql.org/companies.php.
+ + http://techdocs.postgresql.org/companies.php. -Посетите страничку со специальной формой отчёта об ошибке в PostgreSQL по адресу: - + http://www.postgresql.org/support/submitbug.
Также проверьте наличие более свежей версии PostgreSQL на нашем - FTP сайте - ftp://ftp.PostgreSQL.org/pub.
+ FTP сайте + ftp://ftp.PostgreSQL.org/pub/. -Последний выпуск PostgreSQL - это версия 8.0.1
+Последний выпуск PostgreSQL - это версия 8.0.2
-Мы планируем выпускать новые версии каждые 10-12 месяцев.
+Мы планируем выпускать новые старшие версии каждый год, + а младшие версии каждые несколько месяцев.
-PostgreSQL содержит много документации, включая большое руководство, страницы электронного руководства man и некоторые маленькие тестовые @@ -264,11 +255,13 @@
Существует две книги по PostgreSQL доступные по адресам http://www.PostgreSQL.org/docs/books/awbook.html - и http://www.commandprompt.com/ppbook/. - Список книг по PostgreSQL, которые можно купить доступен по адресу - http://techdocs.postgresql.org/techdocs/bookreviews.php. - Кроме того, по адресу http://techdocs.PostgreSQL.org/ - вы можете найти коллекцию технических статей посвященных PostgreSQL.
+ и http://www.commandprompt.com/ppbook/. + Есть несколько книг по PostgreSQL, которые можно купить. + Одну из наиболее популярных написал Корри Дуглас (Korry Douglas). + Список обзоров по этим книгам доступен по адресу + http://techdocs.postgresql.org/techdocs/bookreviews.php. + Кроме того, по адресу http://techdocs.PostgreSQL.org/ + вы можете найти коллекцию технических статей посвященных PostgreSQL.Клиент командной строки psql имеет несколько команд \d для отображения информации по типам, операторам, функциям, агрегатам и т.д. - @@ -276,56 +269,41 @@
Наш сайт содержит еще больше информации.
-PostgreSQL поддерживает расширенный подкласс SQL-92. Смотрите наш список TODO на предмет известных ошибок, отсутствующих возможностей и будущих планов.
-Книга по PostgreSQL на http://www.PostgreSQL.org/docs/books/awbook.html - научит SQL. Существует другая книга по PostgreSQL на - - http://www.commandprompt.com/ppbook. - Есть прекрасный учебник на http://www.intermedia.net/support/sql/sqltut.shtm, - на - http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM, - и на http://sqlcourse.com.
+Еще один учебник - это книга "Teach Yourself SQL in 21 Days, Second Edition" - (Освой самостоятельно SQL за 21 день, Вторая редакция) - на http://members.tripod.com/er4ebus/sql/index.htm
- -Многим из наших пользователей нравится книга +
Во-первых, возьмите одну из книг по PostgreSQL, о которых говорилось + выше. Еще один учебник - это книга "Teach Yourself SQL in 21 Days, + Second Edition" (Освой самостоятельно SQL за 21 день, Вторая редакция) + на + http://members.tripod.com/er4ebus/sql/index.htm. + Многим из наших пользователей нравится книга The Practical SQL Handbook, Bowman, Judith S., et al., Addison-Wesley. Другим нравится The Complete Reference SQL, Groff et al., McGraw-Hill.
-Для начала, скачайте последнюю версию исходных текстов и прочтите - FAQ и документацию для разработчиков PostgreSQL на нашем сайте или в - дистрибутиве. Затем, подпишитесь на списки рассылки pgsql-hackers и - pgsql-patches. Далее, отправляйте исправления (patches) высокого - качества в список pgsql-patches.
+Существует ограниченный список людей, который имеют привелегию - вносить изменения в CVS архив PostgreSQL. Каждый - из этих людей в свое время отправил так много высококачественных исправлений, - что их было невозможно оставить без внимания и они были удостоены - превилегии вносить изменения, и мы уверены, что те исправления, которые - они внесут будут высокого качества.
+Смотрите + FAQ для разработчиков.
-Существует несколько методов сравнения программного обеспечения: @@ -348,14 +326,8 @@
Если вы ищите какого-то особенного человека, центральный + комитет или управляющую компанию, то напрасно --- их нет. + У нас есть ядро комитета и разработчиков, работающих с CVS, + но эти группы служат больше для административных целей, чем + для управления. Проект напрямую функционирует с помощью + сообщества разработчиков и пользователей, к которому может + присоединится каждый. Всё что нужно -- это подписаться на + списки рассылки и участвовать в дискуссиях. (Подробности о + том как включиться в разработку PostgreSQL смотрите в + + FAQ для разработчиков.)
-Установка PostgreSQL включает только C и встроенный (embedded) C интерфейсы. Все другие интерфейсы @@ -414,8 +401,8 @@ в секции Drivers/Interfaces, а также через поиск в Интернет.
-Прекрасное введение во взаимодействие баз данных и Web можно найти на: http://www.webreview.com
@@ -423,33 +410,26 @@Для интеграции с Web, PHP http://www.php.net является неплохим интерфейсом.
-В сложных случаях, многие пользуются Perl и CGI.pm или mod_perl.
- -Да, существует несколько графических интерфейсов для PostgreSQL. - Они включают PgAdmin III (http://www.pgadmin.org), - PgAccess (http://www.pgaccess.org), - RHDB Admin (http://sources.redhat.com/rhdb/), - TORA (http://www.globecom.net/tora/ - частично коммерческое ПО) - и Rekall ( - http://www.rekallrevealed.org/). Также есть - PhpPgAdmin ( - http://phppgadmin.sourceforge.net/) - интерфейс к PostgreSQL, - основанный на Web.
+В сложных случаях, многие пользуются Perl и DBD::Pg с CGI.pm + или mod_perl.
+ +Да, подробности смотрите в + http://techdocs.postgresql.org/guides/GUITools.
+Задайте опцию --prefix когда запускаете configure.
-По умолчанию, PostgreSQL разрешает только соединения на локальной машине через сокеты домена Unix или TCP/IP соединения. Для того, чтобы @@ -458,8 +438,8 @@ host-авторизация в файле $PGDATA/pg_hba.conf и перестартовать сервер.
-Существует три главных области, которые потенциально могут увеличить производительность:
@@ -510,55 +490,17 @@ -Есть множество установок в настройках сервера, начинающихся
на log_*
, позволяющих протоколировать запросы
и статистику работы процесса, которая очень полезна для отладки
и измерения производительности.
Для предоставления более детальной информации разработчикам - сервера при отладке какой-либо проблемы должны пользоваться - следующие инструкции.
- -Таким же образом можно производить и отладку севера, если он - работает неправильно. Во-первых, при запуске configure с - опцией --enable-cassert, многие вызовы assert() позволяют - отслеживать работу backend процесса и остановку программы при - возникновении каких-либо неожиданностей.
- -Если postmaster не запущен, вы можете запустить - postgres backend из командной строки и ввести ваш оператор - SQL напрямую. Это рекомендуется только для - целей отладки. Заметим, что в этом режиме, запрос завершается символом - новой строки, а не точкой с запятой. Если вы производили компиляцию - с отладочными символами, вы можете использовать любой отладчик, чтобы - посмотреть, что случилось. Поскольку backend запускается не из - postmaster, он не запускается в идентичном окружении и значит - проблемы итераций блокировок/backend не могут быть воспроизведены.
- -Если postmaster запущен, запустите psql в одном
- окне, затем найдите PID процесса postgres,
- используемый psql, используя SELECT pg_backend_pid()
.
- Используйте отладчик для подключения к postgres PID.
- Вы можете установить точки прерывания в отладчике и запустить запрос
- из psql. Если
- вы производите отладку запуска postgres, вы можете установить
- PGOPTIONS="-W n", и затем запустить psql. Эта опция приводит
- к задержке процесса запуска на n секунд, в течение которых
- вы можете подключить к процессу отладчик, установить любые точки
- прерывания и продолжить запуск.
Вы также можете скомпилировать PostgreSQL с профилированием для - того, чтобы увидеть какие функции сколько времени выполняются. - Файлы профилирования backend'а находятся в каталоге - pgsql/data/base/dbname. Файл профилирования клиента - будет помещен в текущий каталог клиента. В Linux для выполнения - профилирования требуется компиляции с -DLINUX_PROFILE.
- -Вы достигли установленного по умолчанию ограничения на 100 сессий подключения к базе данных. Вам необходимо увеличить для @@ -567,11 +509,11 @@ и перестартовать postmaster.
-Разработчики PostgreSQL делают только небольшие изменения между - подвыпусками. Таким образом обновление с версии 7.4 до 7.4.1 не требует + подвыпусками. Таким образом обновление с версии 7.4.0 до 7.4.1 не требует выполнения dump и restore. Однако при выходе очередного выпуска (т.е. при обновлении например, с 7.3 на 7.4) часто меняется внутренний формат системных таблиц и файлов данных. Эти изменения часто носят @@ -585,8 +527,10 @@ использования dump/restore. Комментарии к выпуску говорит когда можно использовать pg_upgrade для этого выпуска.
-Поскольку "железо" персональных компьютеров является наиболее совместимым, люди склонны верить, что такое "железо" имеет одинаковое качество. Это не так. Память ECC, SCSI и качественные материнские платы @@ -600,26 +544,27 @@
Для получения только нескольких строк, если вы знаете их количество - на момент выполнения SELECT используйте LIMIT. + на момент выполнения SELECT используйте LIMIT.
Если есть какой-либо индекс, который совпадает с ORDER BY, то возможно, что весь запрос выполнен и не будет. Если вы не знаете количества необходимых строк на момент выполнения SELECT, используйте курсор и FETCH. -To SELECT a random row, use:
-SELECT col +-To SELECT a random row, use:
+SELECT col FROM tab ORDER BY random() LIMIT 1; -+
Чтобы просматривать таблицы в psql, используйте команду \dt. Полный список команд в psql вы можете получить, используя \?. @@ -642,7 +587,7 @@ для получения информации из системных таблиц базы данных.
-В 8.0 и более поздних версиях, изменение типа колонки выполняется очень легко через ALTER TABLE ALTER COLUMN TYPE.
@@ -656,13 +601,12 @@ COMMIT; -Существуют следующие ограничения:
-
- Максимальный размер базы? неограничен (существуют базы на 32 TB) @@ -691,7 +635,6 @@Максимальное количество индексов в таблице? неограничено
СУБД PostgreSQL может потребоваться дискового пространства до 5 раз больше для сохранения данных из простого текстового файла.
@@ -747,10 +690,10 @@ занимают очень мало места. -Индексы не используются для каждого запроса автоматически. Они +
Индексы не используются для каждого запроса. Они используются только если таблица больше минимального размера и запрос выбирает только маленький процент строк в таблице. Так устроено, потому что доступ к диску с применением рандомизации при сканировании @@ -774,17 +717,18 @@ и в этом случае индекс будет использоваться, поскольку при выполнении будет возвращаться небольшая часть таблицы. Фактически MAX() и MIN() не используют индексы, но индекс используется при построении запросов с - ORDER BY и LIMIT:
-+ ORDER BY и LIMIT: +SELECT col FROM tab ORDER BY col [ DESC ] LIMIT 1; -+
Если вам кажется, что оптимизатор некорректно выбирает последовательный
перебор, используйте SET enable_seqscan TO 'off'
и
- запустите тесты, чтобы увидеть, не стало-ли сканирование индексов быстрее.
+ запустите запрос снова, чтобы увидеть, действительно ли сканирование
+ индексов быстрее.
Когда используются операции с шаблонами, например LIKE @@ -810,15 +754,15 @@ если типы данных точно не совпадали с индексными типами колонок. Это особенно касалось int2, int8 и numeric индексов колонок.
-Смотрите страницу руководства посвященную EXPLAIN.
-Оператор ~ производит поиск регулярного выражения, а оператор ~* производит независимый от регистра букв поиск регулярного @@ -832,23 +776,40 @@ WHERE lower(col) = 'abc'; -
Эта конструкция не будет использовать стандартный индекс. Однако, если - вы создадите индекс выражения, он будет использован:
+ Эта конструкция не будет использовать стандартный индекс. Однако, если + вы создадите индекс выражения, он будет использован:CREATE INDEX tabindex ON tab (lower(col));-
Вы просто сравниваете значение с IS NULL и - IS NOT NULL.
+ IS NOT NULL, как здесь: ++ SELECT * + FROM tab + WHERE col IS NULL; ++ +
Чтобы отсортировать данные по значению
+ SELECT * + FROM tab + ORDER BY (col IS NOT NULL); ++ +
@@ -889,8 +849,7 @@-
- Тип Внутреннее имя @@ -879,7 +840,6 @@char один символ
Первые четыре типа являются "varlena" типами (т.е., первые четыре байта на диске являются длинной, за которой следуют данные). Таким образом, фактически используемое пространство больше, чем - обозначенный размер. Однако, эти типы данных также поддаются сжатию - или могут быть сохранены не в строком виде через TOAST, + обозначенный размер. Однако, длинные значения также сжимаются, так что занимаемое дисковое пространство может также быть и меньше, чем ожидалось.
@@ -906,8 +865,8 @@ которых могут включать NULL байты. Все типы описанные здесь, имеют сходные характеристики производительности. -PostgreSQL поддерживает тип данных SERIAL. Он автоматически создает последовательность. Например:
@@ -918,7 +877,7 @@ ); -автоматически транслируется в:
+ автоматически транслируется в:CREATE SEQUENCE person_id_seq; CREATE TABLE person ( @@ -930,8 +889,8 @@ Смотрите подробности о последовательностях на странице руководства посвященной create_sequence. --4.11.2) Как мне получить значение при вставке - SERIAL?
+4.11.2) Как мне получить значение при вставке + SERIAL?
Один из способов состоит в получении следующего значения SERIAL из объекта sequence с помощью функции @@ -960,16 +919,16 @@
Нет. currval() возвращает текущее значение, назначенное вашей сессией, а не другими сессиями.
-Для реализации конкуретности, значения последовательностей, при необходимости выдаются во время запуска транзакций и не блокируются @@ -977,8 +936,8 @@ нумерации при отмене транзакций.
-Каждая, создаваемая в PostgreSQL табличная строка, получает уникальный индентификатор OID за исключением случая когда @@ -993,17 +952,17 @@ OID, потому что последовательности SERIAL уникальны только внутри таблицы и таким образом меньше подвержены переполнению. Для хранения значений 8-ми байтной последовательности - доступен тип SERIAL8.
+ доступен тип SERIAL8. -TID используется для идентификации специальных - физических записей с блочными и offset значениями. TID +
CTID используется для идентификации специальных + физических записей с блочными и offset значениями. CTID изменяется после того как строки в таблице были изменены или перегружены. - TID используется индексными записями в качестве +
TID используется индексными записями в качестве указателя на физические записи.
-Предположительно у вас закончилась виртуальная память или что ваше ядро имеет маленький лимит на определенные ресурсы. @@ -1022,38 +981,21 @@ клиентом, потому что backend возвращает слишком большой объем данных, попытайтесь выполнить эту команду перед запуском клиента. -
Из psql, наберите SELECT version();
Вам нужно при использовании большого объекта поместить в начале
- BEGIN WORK
и в конце COMMIT
, а внутри
- получившегося блока lo_open
... lo_close.
В настоящий момент PostgreSQL требует, чтобы при закрытии большого - объекта происходило выполнение транзакции. Таким образом, первая же - попытка сделать что-либо с большим объектом, не соблюдая данного правила - приведет к сообщению invalid large obj descriptor, так как - код выполняющий работу над большим объектом (по крайней мере в - настоящий момент) будет генерировать сообщение об ошибке если вы не - используете транзакцию.
- -Если вы используете такой интерфейс клиента как ODBC,
- вам возможно понадобится установить auto-commit off.
Используйте CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );-
PostgreSQL поддерживает внешнее связывание, используя стандартный синтаксис SQL. Вот два примера:
@@ -1077,8 +1019,8 @@ CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); RIGHT и FULL связываниях. Обычные связывания называются INNER связывания. -Не существует способа создать запрос к базам данных отличным от текущей. Поскольку PostgreSQL загружает системные каталоги специфичные для базы @@ -1089,14 +1031,16 @@ CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); соедиенения с различными базами данных и таких образом объединять информацию из них.
-Вы можете легко использовать функции, возвращающие список, http://techdocs.postgresql.org/guides/SetReturningFunctions.
-PL/PgSQL кэширует сценарии функции и один из негативных эффектов этого состоит в том, что если функция PL/PgSQL обращается к временной таблице и эта таблица позднее удаляется и пересоздается, а функция затем вызывается @@ -1106,53 +1050,26 @@ CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); таблицам в PL/PgSQL. Использование этого оператора заставит запрос перегенерироваться каждый раз.
-Проблема может заключаться в нескольких вещах. Попытайтесь сперва - протестировать вашу функцию в отдельной самостоятельной программе.
- -Отправьте ваши расширения в список рассылки pgsql-hackers - и они по возможности будут помещены в подкаталог contrib/.
+В версиях PostgreSQL, начиная с 7.3, функции, возвращающие таблицы - полностью поддерживаются в C, PL/PgSQL и SQL. Подробности смотрите в - Руководстве Программиста. Пример возвращающей таблицу функции, - написанной на C, можно найти в contrib/tablefunc.
- -Файлы Makefile не имеют правильных зависимостей для include - файлов. Вы должны выполнить make clean и затем make. - Если вы используете GCC вы можете использовать опцию - --enable-depend в configure чтобы поручить компилятору - автоматически отслеживать зависимости.
+Хотя "репликация" -- это единый термин, есть несколько разных технологий + для выполнения репликаций с разными особенностями для каждой.
+ +Репликация Master/slave позволяет иметь один главный (master) сервер + для выполнения запросов чтения/записи, в то время как подчинённые + (slave) сервера могут производить только запросы + чтения/SELECT. Наиболее популярным решением для репликации + master-slave в PostgreSQL является + + Slony-I.
+ +Репликация Multi-master позволяет выполнять запросы чтения/записи + на нескольких, реплицируемых друг с другом компьюетрах. Эта особенность + также приводит к потере производительности, потому что необходима + синхронизация изменений между несколькими серверами. Наиболее + популярным решением для такой репликации в PostgreSQL является + Pgcluster. +