mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
1201 lines
53 KiB
Plaintext
1201 lines
53 KiB
Plaintext
|
||
Ответы на часто задаваемые вопросы по PostgreSQL
|
||
|
||
Дата последнего обновления: Среда 22 Августа 19:20:40 EDT 2002
|
||
|
||
Английский вариант сопровождает: Брюс Момьян (Bruce Momjian)
|
||
(pgman@candle.pha.pa.us)
|
||
|
||
Перевел на русский: Виктор Вислобоков (victor_v@permonline.ru)
|
||
|
||
Самую свежую английскую версию документа можно найти на
|
||
http://www.PostgreSQL.org/docs/faq-english.html.
|
||
|
||
Ответы на вопросы специфичные для конкретных платформ можно найти на
|
||
http://www.PostgreSQL.org/users-lounge/docs/faq.html.
|
||
_________________________________________________________________
|
||
|
||
Общие вопросы
|
||
|
||
1.1) Что такое PostgreSQL? Как произносится это название?
|
||
1.2) Каковы авторские права на PostgreSQL?
|
||
1.3) На каких Unix платформах работает PostgreSQL?
|
||
1.4) Существуют ли версии портированные не на Unix системы?
|
||
1.5) Где можно взять PostgreSQL?
|
||
1.6) Где получить поддержку?
|
||
1.7) Какая последняя версия?
|
||
1.8) Какая документация имеется в наличии?
|
||
1.9) Как найти информацию об известных ошибках или отсутствующих
|
||
возможностях?
|
||
1.10) Как научиться SQL?
|
||
1.11) Решена ли в PostgreSQL проблема 2000-го года (Y2K)?
|
||
1.12) Как присоединится к команде разработчиков?
|
||
1.13) Как отравить сообщение об ошибке?
|
||
1.14) Как сравнивать PostgreSQL с другими СУБД?
|
||
1.15) Как оказать финансовую помощь PostgreSQL?
|
||
|
||
Вопросы пользователей по клиентской части
|
||
|
||
2.1) Существуют ли ODBC драйвера для PostgreSQL?
|
||
2.2) Какие инструменты существуют для использования PostgreSQL через
|
||
Web?
|
||
2.3) Есть ли у PostgreSQL графический интерфейс пользователя?
|
||
Генератор отчетов? Встроенный интерфейс для языка запросов?
|
||
2.4) Какие языки могут взаимодействовать с PostgreSQL?
|
||
|
||
Вопросы администрирования
|
||
|
||
3.1) Как мне установить PostgreSQL в место отличное от
|
||
/usr/local/pgsql?
|
||
3.2) Когда я запускаю postmaster, я получаю сообщение Bad System Call
|
||
или сообщение core dumped. Почему?
|
||
3.3) Когда я пытаюсь запустить postmaster, я получаю ошибки
|
||
IpcMemoryCreate. Почему?
|
||
3.4) Когда я пытаюсь запустить postmaster, я получаю ошибки
|
||
IpcSemaphoreCreate. Почему?
|
||
3.5) Как мне управлять соединениями с других компьютеров?
|
||
3.6) Какие настройки мне нужно сделать для улучшения
|
||
производительности?
|
||
3.7) Какие возможности для отладки есть в наличии?
|
||
3.8) Почему я получаю сообщение "Sorry, too many clients" когда
|
||
пытаюсь подключиться к базе?
|
||
3.9) Что это за файлы pg_sorttempNNN.NN в моем каталоге с базой
|
||
данных?
|
||
3.10) Почему необходимо делать dump и restore при обновлении выпусков
|
||
PostgreSQL?
|
||
|
||
Вопросы эксплуатации
|
||
|
||
4.1) В чем отличие между бинарным и нормальным курсором?
|
||
4.2) Как выполнить SELECT только для нескольких первых строчек
|
||
запроса?
|
||
4.3) Как получить список таблиц или других компонентов в psql?
|
||
4.4) Как удалить колонку из таблицы?
|
||
4.5) Каковы максимальные размеры для записей, таблиц и базы данных?
|
||
4.6) Как много дискового пространства в базе данных нужно для
|
||
сохранения данных из обычного текстового файла?
|
||
4.7) Как мне убедиться, что существуют нужные мне таблицы, индексы,
|
||
базы данных и пользователи?
|
||
4.8) У меня медленно работают запросы или не происходит использования
|
||
индексов. Почему?
|
||
4.9) Как посмотреть на то, как оптимизатор выполняет мой запрос?
|
||
4.10) Что такое R-tree индекс?
|
||
4.11) Что такое Genetic Query Optimizer?
|
||
4.12) Как мне выполнить поиск регулярного выражения и поиск
|
||
независимый от регистра букв поиск регулярного выражения? Как мне
|
||
использовать индекс для поиска независимого от регистра букв?
|
||
4.13) Как я могу определить, что значение поля равно NULL в каком-либо
|
||
запросе?
|
||
4.14) Каковы отличия между разными символьными типами?
|
||
4.15.1) Как мне создать поле serial/с-авто-увеличением?
|
||
4.15.2) Как мне получить значение при вставке SERIAL?
|
||
4.15.3) Не может ли получиться так, что использование currval() и
|
||
nextval() приведет к зациклированию с другими пользователями?
|
||
4.15.4) Почему числа из моей последовательности не используются снова
|
||
при отмене транзакции? Почему создаются разрывы при нумерации в
|
||
колонке, где я использую последовательность/SERIAL?
|
||
4.16) Что такое OID? Что такое TID?
|
||
4.17) Что означают некоторые термины используемые в PostgreSQL?
|
||
4.18) Почему я получаю ошибку "ERROR: Memory exhausted in
|
||
AllocSetAlloc()"?
|
||
4.19) Как мне узнать, какая версия PostgreSQL запущена?
|
||
4.20) Почему при работе с моим большим объектом я получаю ошибку
|
||
"invalid large obj descriptor"?
|
||
4.21) Как мне создать колонку которая по умолчанию будет содержать
|
||
текущее время?
|
||
4.22) Почему мои подзапросы, использующие IN так медленно работаеют?
|
||
4.23) Как выполнить внешнее связывание?
|
||
4.24) Как выполнять запросы, использующие несколько баз данных?
|
||
4.25) Как мне вернуть из функции несколько записей?
|
||
4.26) Почему я не могу надежно создавать/удалять временные таблицы в
|
||
функциях PL/PgSQL?
|
||
|
||
Расширения PostgreSQL
|
||
|
||
5.1) Я написал функцию определяемую пользователем. Когда я запускаю ее
|
||
в psql, почему я получаю dump core?
|
||
5.2) Как я могу внести некоторые классные новые типы и функции в
|
||
PostgreSQL?
|
||
5.3) Как мне написать C функцию, возвращающую запись?
|
||
5.4) Я изменил исходный файл. Почему после перекомпиляции я не вижу
|
||
изменений?
|
||
_________________________________________________________________
|
||
|
||
Общие вопросы
|
||
|
||
1.1) Что такое PostgreSQL?
|
||
|
||
PostgreSQL произносится Post-Gres-Q-L (Пост-Грес-Кью-Эл).
|
||
|
||
PostgreSQL - это расширение СУБД POSTGRES, исследовательский прототип
|
||
нового поколения СУБД. PostgreSQL одновременно сохраняет мощную модель
|
||
данных и общирное количество типов POSTGRES, и замещает язык запросов
|
||
PostQuel на расширенное подмножество SQL. PostgreSQL - это свободное и
|
||
полностью открытое программное обеспечение.
|
||
|
||
Разработку PostgreSQL выполняет команда, связанная через Internet, все
|
||
участники которой подписаны на список рассылки разработчиков. В
|
||
настоящее время, их координатором является Марк Форнай (Marc G.
|
||
Fournier) (scrappy@PostgreSQL.org). (См. ниже о том, как подключиться
|
||
к разработке). Эта команда теперь отвечает за всю разработку
|
||
PostgreSQL.
|
||
|
||
Авторами PostgreSQL 1.01 являются Эндрю Ю (Andrew Yu) и Джоли Чен
|
||
(Jolly Chen). Многие другие внесли свой вклад в перенос на другие
|
||
платформы, тестирование, отладку и расширение этого кода.
|
||
Первоначальный код Postgres, из которого появился PostgreSQL, был
|
||
итогом усилий многих академических студентов, неакадемических
|
||
студентов и множества разных программистов, работавших под
|
||
руководством профессора Майкла Стоунбрейкера (Michael Stonebraker) в
|
||
Калифорнийском университете, Беркли.
|
||
|
||
Первоначальное имя, данное в Беркли, было Postgres. Когда в 1995 году
|
||
была добавлена функциональность SQL, это имя было изменено на
|
||
Postgres95. Но и это имя было изменено в конце 1996 на PostgreSQL.
|
||
|
||
1.2) Каковы авторские права на PostgreSQL?
|
||
|
||
PostgreSQL попадает под действие следующего COPYRIGHT:
|
||
|
||
Система Управления Базами Данных PostgreSQL
|
||
|
||
Portion copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||
Portions Copyright (c) 1994-6 Regents of the University of California
|
||
|
||
Предоставляются права на использование, копирование, изменение и
|
||
распространение данного программного обеспечения и его документации
|
||
для любых целей, бесплатно и без подписания какого-либо соглашения,
|
||
при условии что для каждой копии будут предоставлены данное выше
|
||
замечание об авторских правах, текущий параграф и два следующих
|
||
параграфа.
|
||
|
||
КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ
|
||
ПОВРЕЖДЕНИЯ, ВКЛЮЧАЯ ПОТЕРЮ ДОХОДА, НАНЕСЕННЫЕ ПРЯМЫМ ИЛИ НЕПРЯМЫМ,
|
||
СПЕЦИАЛЬНЫМ ИЛИ СЛУЧАЙНЫМ ИСПОЛЬЗОВАНИЕМ ДАННОГО ПРОГРАММНОГО
|
||
ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ
|
||
БЫЛ ИЗВЕЩЕН О ВОЗМОЖНОСТИ ТАКИХ ПОВРЕЖДЕНИЙ.
|
||
|
||
КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ СПЕЦИАЛЬНО ОТКАЗЫВАЗЫВАЕТСЯ ПРЕДОСТАВЛЯТЬ
|
||
ЛЮБЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ТОЛЬКО ЭТИМИ ГАРАНТИЯМИ:
|
||
НЕЯВНЫЕ ГАРАНТИИ ПРИГОДНОСТИ ТОВАРА ИЛИ ПРИГОДНОСТИ ДЛЯ ОТДЕЛЬНОЙ
|
||
ЦЕЛИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ ПРИЦИПА
|
||
"КАК ЕСТЬ" И КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ ОБЯЗАН ПРЕДОСТАВЛЯТЬ
|
||
СОПРОВОЖДЕНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, РАСШИРЕНИЯ ИЛИ ИЗМЕНЕНИЯ.
|
||
|
||
Вышеизложенное является BSD лицензией, классической лицензией
|
||
программного обеспечения с открытым кодом. Эта лицензия не накладывает
|
||
ограничений на использование исходного кода. Нам нравится эта лицензия
|
||
и мы не собираемся её менять.
|
||
|
||
1.3) На каких Unix платформах работает PostgreSQL?
|
||
|
||
Обычно, PostgreSQL может работать на любой современной платформе
|
||
совместимой с Unix. В инструкции по установке, вы найдете список тех
|
||
платформ, на которых были проведены тестовые запуски PostgreSQL к
|
||
моменту выхода данной версии.
|
||
|
||
1.4) Существуют ли версии перенесенные не на Unix системы?
|
||
|
||
Клиент
|
||
|
||
Для запуска на платформах MS Windows возможна компиляция C библиотеки
|
||
libpq, psql и других интерфесов и бинарных файлов. В этом случае,
|
||
клиент запускается на MS Windows и связывается по TCP/IP с сервером,
|
||
запущенным на одной из поддерживаемых Unix платформ. В дистрибутив
|
||
включается файл win31.mak для того, чтобы можно было провести сборку
|
||
библиотеки libpq и psql для Win32. PostgreSQL также работает через
|
||
ODBC.
|
||
|
||
Сервер
|
||
|
||
Сервер БД может быть запущен на Windows NT и Win2k, используя
|
||
библиотеку Cygwin, разработанную для переноса программного обеспечения
|
||
Unix в NT. Смотрите pgsql/doc/FAQ_MSWIN в дистрибутиве или MS Windows
|
||
FAQ на нашем сайте. Мы не планируем специально переносить PostgreSQL
|
||
на какую-либо платформу Microsoft.
|
||
|
||
1.5) Где можно взять PostgreSQL?
|
||
|
||
Например, воспользовавшись анонимным доступом на ftp сайт PostgreSQL
|
||
ftp://ftp.PostgreSQL.org/pub. Список зеркал вы найдете на нашем
|
||
основном сайте.
|
||
|
||
1.6) Где получить поддержку?
|
||
|
||
Основной список рассылки: pgsql-general@PostgreSQL.org. В нем можно
|
||
обсуждать любые темы, касающиеся PostgreSQL. Чтобы подписаться,
|
||
отправьте письмо по электронной почте, в котором в теле письма (не в
|
||
теме) напишите следующие строки:
|
||
subscribe
|
||
end
|
||
|
||
на адрес pgsql-general-request@PostgreSQL.org.
|
||
|
||
Существует дайжест список. Чтобы подписаться на него, отправьте письмо
|
||
по электронной почте на адрес:
|
||
pgsql-general-digest-request@PostgreSQL.org и в теле письма напишите
|
||
строчки строчки:
|
||
subscribe
|
||
end
|
||
|
||
Дайжесты отправляются подписчикам, когда в основном списке рассылки
|
||
накопится около 30 килобайт сообщений.
|
||
|
||
Доступен и список рассылки сообщений об ошибках. Чтобы подписаться на
|
||
этот список, отправьте по электронной почте письмо на адрес
|
||
pgsql-bugs-request@PostgreSQL.org и в теле письма напишите строчки
|
||
строчки:
|
||
subscribe
|
||
end
|
||
|
||
Также имеется список рассылки с дискуссиями разработчиков. Чтобы
|
||
подписаться на этот список, отправьте по электронной почте письмо на
|
||
адрес pgsql-hackers-request@PostgreSQL.org и в теле письма напишите
|
||
строчки строчки:
|
||
subscribe
|
||
end
|
||
|
||
Дополнительные списки рассылки и инфомацию о PostgreSQL можно найти на
|
||
домашней страничке PostgreSQL по адресу:
|
||
|
||
http://www.PostgreSQL.org
|
||
|
||
Еще существует IRC канал на EFNet, с названием #PostgreSQL. Я
|
||
использую для подключения к этому каналу команду Unix irc -c
|
||
'#PostgreSQL' "$USER" irc.phoenix.net.
|
||
|
||
Список коммерческой поддержки компаний доступен на
|
||
http://www.postgresql.org/users-lounge/commercial-support.html.
|
||
|
||
1.7) Какая последняя версия?
|
||
|
||
Последний выпуск PostgreSQL - это версия 7.2.2.
|
||
|
||
Мы планируем выпускать новые версии каждые четыре месяца.
|
||
|
||
1.8) Какая документация имеется в наличии?
|
||
|
||
В дистрибутив включаются различные руководства, страницы электронного
|
||
руководства man и некоторые маленькие тестовые примеры. Смотрите в
|
||
каталог /doc. Вы также можете просматривать документацию в Интернет по
|
||
адресу http://www.PostgreSQL.org/users-lounge/docs/.
|
||
|
||
Существует две книги по PostgreSQL доступные по адресам
|
||
http://www.PostgreSQL.org/docs/awbook.html и
|
||
http://www.commandprompt.com/ppbook/. Список книг по PostgreSQL,
|
||
которые можно купить доступен по адресу
|
||
http://www.postgresql.org/books/. Кроме того, по адресу
|
||
http://techdocs.postgresql.org/ вы можете найти коллекцию технических
|
||
статей посвященных PostgreSQL.
|
||
|
||
psql имеет несколько прекрасных команд \d для отображения информации
|
||
по типам, операторам, функциям, агрегатам и т.д.
|
||
|
||
Наш сайт содержит еще больше информации.
|
||
|
||
1.9) Как найти информацию об известных ошибках или отсутствующих
|
||
возможностях?
|
||
|
||
PostgreSQL поддерживает расширенный подкласс SQL-92. Смотрите наш
|
||
список TODO на предмет известных ошибок, отсутствующих особенностях и
|
||
будущих планов.
|
||
|
||
1.10) Как мне научиться SQL?
|
||
|
||
Книга по PostgreSQL на http://www.PostgreSQL.org/docs/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
|
||
|
||
Многим из наших пользователей нравится книга The Practical SQL
|
||
Handbook, Bowman, Judith S., et al., Addison-Wesley. Другим нравится
|
||
The Complete Reference SQL, Groff et al., McGraw-Hill.
|
||
|
||
1.11) Решена ли в PostgreSQL проблема 2000-го года (Y2K)?
|
||
|
||
Да, мы легко манипулируем датами после 2000 года и перед 2000 годом.
|
||
|
||
1.12) Как присоединится к команде разработчиков?
|
||
|
||
Для начала, скачайте последнюю версию исходных текстов и прочтите
|
||
документацию разработчиков PostgreSQL на нашем сайте или в
|
||
дистрибутиве. Затем, подпишитесь на списки рассылки pgsql-hackers и
|
||
pgsql-patches. Далее, отправляйте исправления (patches) высокого
|
||
качества в список pgsql-patches.
|
||
|
||
Существует ограниченный список людей, который имеют привелегию вносить
|
||
изменения в CVS архив PostgreSQL. Каждый из этих людей в свое время
|
||
отправил так много высококачественных исправлений, что их было
|
||
невозможно оставить без внимания и они были удостоены превилегии
|
||
вносить изменения, и мы уверены, что те исправления, которые они
|
||
внесут будут высокого качества.
|
||
|
||
1.13) Как отравить сообщение об ошибке??
|
||
|
||
Пожалуйста посетите страничку PostgreSQL BugTool, на которой
|
||
предоставлены детальные инструкции о том как отправить сообщение об
|
||
ошибке.
|
||
|
||
Также не забудьте посмотреть на ftp://ftp.PostgreSQL.org/pub на
|
||
предмет более свежих версий PostgreSQL или заплат.
|
||
|
||
1.14) Как сравнивать PostgreSQL с другими СУБД?
|
||
|
||
Существует несколько методов сравнения программного обеспечения:
|
||
возможности, производительность, надежность, поддержка и цена.
|
||
|
||
Возможности
|
||
PostgreSQL имеет большинство возможностей представленных в
|
||
больших коммерческих СУБД, такие как: транзакции, подзапросы,
|
||
триггеры, обзоры (views), внешний ключ ссылочной целостности и
|
||
разные блокировки. У нас есть некоторые возможности, которых
|
||
нет у них: типы, определяемые пользователем, механизм
|
||
наследования, правила и конкуретное многоверсионное управление
|
||
для работы с содержимым блокировок.
|
||
|
||
Производительность
|
||
PostgreSQL имеет производительность схожую с другими
|
||
коммерческими СУБД и с СУБД с открытым исходным кодом, в
|
||
каких-то аспектах работая быстрее чем они, в каких-то медленее.
|
||
В сравнении с MySQL или линейными СУБД, мы медленее при
|
||
операциях вставки/обновления, потому что управляем
|
||
транзакциями. И разумеется, MySQL не имеет каких-либо
|
||
возможностей из перечисленых выше, в секции Возможности. Мы
|
||
делаем упор на надежность и расширенные возможности, но мы
|
||
также продолжаем увеличивать производительность с каждым
|
||
выпуском. Существует интересная страничка в Интернет,
|
||
сравнивающая PostgreSQL и MySQL на
|
||
http://openacs.org/why-not-mysql.html
|
||
|
||
Надежность
|
||
Мы понимали, что наша СУБД должна быть надежной или она ничего
|
||
не будет стоить. Мы стараемся выпускать хорошо проверенный,
|
||
стабильный код, который содержит минимум ошибок. Каждый выпуск
|
||
проходит стадию бета-тестирования по крайней мере в течении
|
||
одного месяца и наша история выпусков показывает что мы можем
|
||
предоставлять стабильные, монолитные выпуски, которые готовы к
|
||
продуктивному использованию. Мы верим, что мы производим
|
||
проверку не хуже, чем у других СУБД.
|
||
|
||
Поддержка
|
||
Наш список рассылки представлен большой группой разработчиков и
|
||
пользователей, которые могут помочь решить любые возникшие
|
||
проблемы. В то же время, мы не гарантируем какие-либо
|
||
исправления, но и разработчики коммерческих СУБД не всегда
|
||
делают исправления. Прямой доступ к разработчикам, сообществу
|
||
пользователей, руководствам и исходным текстам часто делают
|
||
поддержку PostgreSQL превосходящей другие СУБД. Существует
|
||
коммерческая поддержка по результам возникших инцидентов,
|
||
которая доступна для тех кому она нужна. (Смотрите Как получить
|
||
поддержку?.)
|
||
|
||
Цена
|
||
Наш продукт бесплатен как для коммерческого так, и не для
|
||
коммерческого использования. Вы можете добавлять свой код в наш
|
||
продукт без ограничений, за исключением тех, что описываются в
|
||
нашей лицензии стиля BSD, которая приведена выше.
|
||
|
||
1.15) Как оказать финансовую помощь PostgreSQL?
|
||
|
||
PostgreSQL имеет одноранговую инфраструктуру с того самого времени как
|
||
мы начали разработку 6 лет назад. Мы должны благодарить за это Марка
|
||
Фоная (Marc Fournier), который создал эту инфраструктуру и управляет
|
||
ей на протяжении этих лет.
|
||
|
||
Качественная инфраструктура очень важна для проектов с открытым
|
||
исходным кодом. Она предотвращает расколы, которые могут сильно
|
||
задержать поступательное движение проекта.
|
||
|
||
Разумеется, эта инфраструктура не является дешевой. Существует
|
||
некоторое количество ежемесячных и одноразовых расходов, которые
|
||
требуют денег. Если вы или ваша компания имеет деньги, которые можно
|
||
передать в помощь нашим усилиям, пожалуйста посетите страничку
|
||
https://store.pgsql.com/shopping/index.php?id=1 и сделайте свой вклад.
|
||
|
||
Хотя на страничке говорится о PostgreSQL, Inc, пункт "contributions"
|
||
предназначен исключительно для поддержки проекта PostgreSQL и не
|
||
передается какой-либо конкретной компании. Если хотите, то можете это
|
||
проверить, написав письмо на контактный адрес.
|
||
_________________________________________________________________
|
||
|
||
Вопросы пользователей по клиентской части
|
||
|
||
2.1) Существуют ли ODBC драйвера для PostgreSQL?
|
||
|
||
Существует два ODBC драйвера, PsqlODBC и OpenLink ODBC.
|
||
|
||
PsqlODBC включается в дистрибутив. Больше информации об этом драйвере
|
||
можно найти на ftp://ftp.PostgreSQL.org/pub/odbc/.
|
||
|
||
OpenLink ODBC можно взять на http://www.openlinksw.com. Этот драйвер
|
||
работает с их стандартным клиентским программным обеспечением,
|
||
использующим ODBC, и таким образом, ODBC драйверы для PostgreSQL
|
||
доступны для каждой из поддерживаемых ими платформ (Win, Mac, Unix,
|
||
VMS).
|
||
|
||
Возможно они будут продавать свой продукт тем кому нужна коммерческая
|
||
поддержка, но бесплатная версия всегда будет доступна. Пожалуйста,
|
||
направляйте вопросы на адрес postgres95@openlink.co.uk.
|
||
|
||
Также посмотрите ODBC раздел в руководстве программиста.
|
||
|
||
2.2) Какие инструменты существуют для использования PostgreSQL через Web?
|
||
|
||
Прекрасное введение во взаимодействие баз данных и Web можно найти на:
|
||
http://www.webreview.com
|
||
|
||
Также загляните на http://www.phone.net/home/mwm/hotlist/.
|
||
|
||
Для интеграции с Web, одним из превосходных инструментов является PHP.
|
||
Домашняя станичка http://www.php.net.
|
||
|
||
Для комплексных решений, многие пользуются Perl интерфейсом и CGI.pm.
|
||
|
||
2.3) Есть ли у PostgreSQL графический интерфейс пользователя? Генератор
|
||
отчетов? Встроенный интерфейс для языка запросов?
|
||
|
||
У нас есть прекрасный горафический интерфейс, называемый pgaccess,
|
||
который является частью дистрибутива. pgaccess также емеет генератор
|
||
отчетов. Его страничка http://www.flex.ro/pgaccess
|
||
|
||
Мы также включаем ecpg, который предоставляет встроенный интерфейс к
|
||
языку запросов SQL из C.
|
||
|
||
2.4) Какие языки могут взаимодействовать с PostgreSQL?
|
||
|
||
Вот эти:
|
||
* C (libpq)
|
||
* C++ (libpq++)
|
||
* Embedded C (ecpg)
|
||
* Java (jdbc)
|
||
* Perl (perl5)
|
||
* ODBC (odbc)
|
||
* Python (PyGreSQL)
|
||
* TCL (libpgtcl)
|
||
* C Easy API (libpgeasy)
|
||
* Embedded HTML (PHP from http://www.php.net)
|
||
|
||
Дополнительные интерфейсы доступны по адресу
|
||
http://www.postgresql.org/interfaces.html.
|
||
_________________________________________________________________
|
||
|
||
Вопросы администрирования
|
||
|
||
3.1) Как мне установить PostgreSQL в место отличное от /usr/local/pgsql?
|
||
|
||
Задайте опцию --prefix когда запускаете configure.
|
||
|
||
3.2) Когда я запускаю postmaster, я получаю сообщение Bad System Call или
|
||
сообщение core dumped. Почему?
|
||
|
||
Это может быть вызвано разными проблемами, но первое, что нужно
|
||
сделать - это убедиться в том, что в вашем ядре установлено расширение
|
||
System V. PostgreSQL требует, чтобы ядро поддерживало разделяемую
|
||
память и семафоры.
|
||
|
||
3.3) Когда я пытаюсь запустить postmaster, я получаю ошибки
|
||
IpcMemoryCreate. Почему?
|
||
|
||
Либо у вас в ядре неправильные настройки разделяемой памяти, либо
|
||
вашему ядру нужно большее количество доступной разделяемой памяти. Те
|
||
конкретные действия, которые вам нужно произвести зависят от
|
||
архитектуры вашей машины и от того как много буферов и backend
|
||
процессов вы настроили для postmaster. Для большинства систем, с
|
||
количеством буферов и процессов по умолчанию, необходимый минимум -
|
||
это около 1 мегабайта. Подробности о разделяемой памяти и семафорах
|
||
смотрите в Руководстве администратора PostgreSQL.
|
||
|
||
3.4) Когда я пытаюсь запустить postmaster, я получаю ошибки
|
||
IpcSemaphoreCreate. Почему?
|
||
|
||
Если это сообщение IpcSemaphoreCreate: semget failed (No space left on
|
||
device) то настройки вашего ядра таковы, что ему не хватает семафоров.
|
||
Postgres требует один семафор на потенциальный backend процесс.
|
||
Временным решением является запуск postmaster с настройками на мешьшее
|
||
количество backend процессов. Используйте -N с значением меньшим чем
|
||
32, которое принято по умолчанию. Более правильное решение - это
|
||
увеличить значения SEMMNS и SEMMNI в настрйках ядра.
|
||
|
||
Неисправные семафоры также могут привести к падению СУБД во время
|
||
доступа к базе данных.
|
||
|
||
Если вы получили какое-либо другое сообщение об ошибке, то вполне
|
||
возможно, что в вашем ядре вообще не настроена поддержка семафоров.
|
||
Смотрите подробности о разделяемой памяти и семафорах в Руководстве
|
||
Администратора PostgreSQL.
|
||
|
||
3.5) Как мне управлять соединениями с других компьютеров?
|
||
|
||
По умолчанию, PostgreSQL разрешает только соединения на локальной
|
||
машине через сокеты домена Unix. Другие машины не смогут подключиться
|
||
к базе пока для postmaster не будет задан флаг -i и пока не будет
|
||
разрешена host-авторизация в файле $PGDATA/pg_hba.conf. Эти действия
|
||
делают возможными TCP/IP соединения.
|
||
|
||
3.6) Какие настройки мне нужно сделать для улучшения производительности?
|
||
|
||
Несомненно, индексы могут увеличить скорость выполнения запросов.
|
||
Команда EXPLAIN позволяет вам посмотреть как PostgreSQL интерпретирует
|
||
ваш запрос и какие индексы используются.
|
||
|
||
Если вы выполняете много операторов INSERT, рассмотрите возможность
|
||
выполнять их в большой пачке, используя команду COPY. Это значительно
|
||
быстрее, чем отдельные INSERT. Во-вторых, операторы вне блока
|
||
транзакции BEGIN WORK/COMMIT сами выполняют транзакцию. Подумайте над
|
||
выполнением нескольких операторов в одном блоке транзакции. Это
|
||
уменьшит количество транзакций. Также, задумайтесь над удалением и
|
||
пересозданием индексов, когда вы выполняете большие изменения данных.
|
||
|
||
Существует несколько опций настройки. Вы можете запретить fsync() при
|
||
старте postmaster с опцией -o -F. Это предотвратит вызовы fsync(),
|
||
которые приводят к сбросу данных на диск после каждой транзакции.
|
||
|
||
Вы можете также использовать для postmaster опцию -B для увеличения
|
||
количества буферов разделяемой памяти, которая используется backend
|
||
процессами. Если вы сделаете значение этого параметра слишком большим,
|
||
то postmaster может не запустится потому что вы исчерпаете ограничение
|
||
ядра на объем разделяемой памяти. Каждый буфер имеет размер в 8
|
||
килобайт и по умолчанию выделяется 64 буфера.
|
||
|
||
Вы можете также использовать backend опцию -S для увеличения
|
||
максимального количества памяти, которое используется backend
|
||
процессом для временных сортировок. Значение для опции -S задается в
|
||
килобайтах и по умолчанию равно 512 (т.е. 512K).
|
||
|
||
Вы также можете использовать команду CLUSTER для группировки данных в
|
||
таблицах на совпадающий индекс. Подробности смотрите на странице
|
||
руководства по команде CLUSTER.
|
||
|
||
3.7) Какие возможности для отладки есть в наличии?
|
||
|
||
PostgreSQL имеет несколько возможностей, позволяющие получить
|
||
информацию о состоянии, которая может быть использована в отладочных
|
||
целях.
|
||
|
||
Во-первых, при запуске configure с опцией --enable-cassert, многие
|
||
вызовы assert() позволяют отслеживать работу backend процесса и
|
||
остановку программы при возникновении каких-либо неожиданностей.
|
||
|
||
И postmaster, и postgres имеют несколько отладочных опций. Во-первых,
|
||
при запуске postmaster, убедитесь, что стандартный вывод и вывод
|
||
ошибок осуществляются в файл журнала:
|
||
cd /usr/local/pgsql
|
||
./bin/postmaster >server.log 2>&1 &
|
||
|
||
Это приведет к появлению файла server.log в главном каталоге
|
||
PostgreSQL. Этот файл содержит полезную информацию о проблемах или
|
||
ошибках, возникших на сервере. Postmaster имеет опцию -d, которая
|
||
позволяет получать при протоколировании более детальную инфрмацию. Для
|
||
опции -d указывается число, которое задает уровень отладки. Будьте
|
||
осторожны, так как высокий уровень отладки приводит к генерации файлов
|
||
журнала большого размера.
|
||
|
||
Если postmaster не запущен, вы можете запустить postgres backend из
|
||
командной строки и ввести ваш оператор SQL напрямую. Это рекомендуется
|
||
только для целей отладки. Заметим, что в этом режиме, запрос
|
||
завершается символом новой строки, а не точкой с запятой. Если вы
|
||
производили компиляцию с отладочными символоами, вы можете
|
||
использовать любой отладчик, чтобы посмотреть, что случилось.
|
||
Поскольку backend запускается не из postmaster, он не запускается в
|
||
идентичном окружении и значит проблемы итераций блокировок/backend не
|
||
могут быть воспроизведены.
|
||
|
||
Если postmaster запущен, запустите psql в одном окне, затем найдите
|
||
PID процесса postgres, используемый psql. Используйте отдадчик для
|
||
подключения к postgres PID. Вы можете установить точки прерывания в
|
||
отладчике и запустить запрос из psql. Если вы производите отладку
|
||
запуска postgres, вы можете установить PGOPTIONS="-W n", и затем
|
||
запустить psql. Эта опция приводит к задержке процесса запуска на n
|
||
секунд, в течение которых вы можете подключить к процессу отладчик,
|
||
установить любые точки прерывания и продолжить запуск.
|
||
|
||
Программа postgres имеет опции -s, -A, и -t которые могут быть очень
|
||
полезными для отладки и измерения производительности.
|
||
|
||
Вы также можете скомпилировать PostgreSQL с профилированием для того,
|
||
чтобы увидеть какие функции сколько времени выполняются. Файлы
|
||
профилирования backend'а находятся в каталоге pgsql/data/base/dbname.
|
||
Файл профилирования клиента будет помещен в текущий каталог клиента. В
|
||
Linux для выполнения профилирования требуется компиляции с
|
||
-DLINUX_PROFILE.
|
||
|
||
3.8) Почему я получаю сообщение "Sorry, too many clients" когда пытаюсь
|
||
подключиться к базе?
|
||
|
||
Вам нужно увеличить ограничение на количество конкуретных backend
|
||
процессов при запуске postmaster.
|
||
|
||
По умолчанию установлен лимит на 32 процесса. Вы можете увеличить этот
|
||
лимит перезапустив postmaster с нужным значением процессов, которое
|
||
указывается в опции -N или изменив файл postgresql.conf.
|
||
|
||
Заметим, что если вы зададите в опции -N значение больше 32, то вы
|
||
также должны увеличить значение в опции -B которое по умолчанию
|
||
установлено в 64; Значение опции -B должно быть по крайней мере вдвое
|
||
больше значения опции -N, и возможно ещё больше для лучшей
|
||
производительности. Для большего количества backend процессов, вам
|
||
также неплохо было бы увеличить некоторые параметры ядра Unix. Это
|
||
такие параметры, как максимальное количество блоков разделяемой
|
||
памяти, SHMMAX; максимальное количество семафоров, SEMMNS и SEMMNI;
|
||
максимальное количество процессов, NPROC; максимальное количество
|
||
процессов на пользователя, MAXUPRC; и максимальное количество открытых
|
||
файлов, NFILE и NINODE. Причина создания ограничения на количество
|
||
backend процессов как раз и состоит в том, чтобы вашей системе хватило
|
||
ресурсов.
|
||
|
||
В PostgreSQL до версии 6.5, максимальное количество backend процессов
|
||
было 64, и изменение этого количества требовало перекомпиляции после
|
||
установки константы MaxBackendId в include/storage/sinvaladt.h.
|
||
|
||
3.9) Что это за файлы pg_sorttempNNN.NN в моем каталоге с базой данных?
|
||
|
||
Это временные файлы, генерируемые во время выполнения запроса.
|
||
Например, если для оператора ORDER BY должна быть выполнена
|
||
сортировка, которая требует больше места чем выделенно для backend
|
||
процесса в опции -S, то создается временный файл для хранения
|
||
дополнительных данных.
|
||
|
||
Временные файлы должны удаляться автоматически, но этого может не
|
||
происходить, если backend процесс падает во время сортировки. Если у
|
||
вас не запущено ни одного backend процесса, то вы можете спокойно
|
||
удалить файлы pg_tempNNN.NN.
|
||
3.10) Почему необходимо делать dump и restore при обновлении выпусков
|
||
PostgreSQL?
|
||
|
||
Разработчики PostgreSQL делают только небольшие изменения между
|
||
подвыпусками. Таким образом обновление с версии 7.2 до 7.2.1 не
|
||
требует выполнения dump и restore. Однако при выходе очередного
|
||
выпуска часто меняется внутренний формат системных таблиц и файлов
|
||
данных. Эти изменения часто носят комплексный характер, так что нет
|
||
возможности обеспечить обратную совместимость файлов данных. Выполение
|
||
dump позволяет получить данные в общем формате, который затем может
|
||
быть загружен при использовании нового внутреннего формата.
|
||
|
||
В тех выпусках, где формат данных на диске не меняется, для проведения
|
||
обновления может быть использован сценарий pg_upgrade без
|
||
использования dump/restore. Комментарии к выпуску говорит когда можно
|
||
использовать pg_upgrade для этого выпуска.
|
||
_________________________________________________________________
|
||
|
||
Вопросы эксплуатации
|
||
|
||
4.1) В чем отличие между бинарным и нормальным курсором?
|
||
|
||
Смотрите описание на страницах руководства посвященным DECLARE.
|
||
|
||
4.2) Как выполнить SELECT только для нескольких первых строчек запроса?
|
||
|
||
Смотрите станицу руководства посвященную FETCH или используйте SELECT
|
||
... LIMIT....
|
||
|
||
Даже если вы хотите получить только первые несколько записей, будет
|
||
выполнен весь запрос. Рассмотрим запрос, который имеет ORDER BY. Если
|
||
есть какой-либо индекс, который совпадает с ORDER BY, PostgreSQL может
|
||
выдать только несколько первых запрошенных записей или может выполнять
|
||
запрос пока не будут выданы желаемые записи.
|
||
|
||
4.3) Как получить список таблиц или других компонентов в psql?
|
||
|
||
Вы можете посмотреть исходный код psql в файле
|
||
pgsql/src/bin/psql/describe.c. Он содержит команды SQL которые
|
||
генерируются при вводе в psql команд, начинающихся с обратной косой
|
||
черты. Вы также моежете запустить psql с опцией -E так, чтобы эта
|
||
программа выдавала запросы, которые она использует для выполнения
|
||
заданных вами команд.
|
||
|
||
4.4) Как удалить колонку из таблицы?
|
||
|
||
Мы не поддерживаем ALTER TABLE DROP COLUMN, но можно сделать так:
|
||
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;
|
||
|
||
4.5) Каковы максимальные размеры для записей, таблиц и базы данных?
|
||
|
||
Существуют следующие ограничения:
|
||
Максимальный размер базы? неограничен (существуют базы на 60 G
|
||
B)
|
||
Максимальный размер таблицы? 16 TB
|
||
Максимальный размер записи? 1.6 TB
|
||
Максимальный размер поля? 1 GB
|
||
Максимальное количество записей в таблице? неограничено
|
||
Максимальное количество колонок в таблице? 250-1600 в зависимости от тип
|
||
а
|
||
Максимальное количество индексов в таблице? неограничено
|
||
|
||
Разумеется, понятие "неограничено" на самом деле ограничивается
|
||
доступным дисковым пространиством и размерами памяти/своппинга. Когда
|
||
значения перечисленные выше неоправдано большие, может пострадать
|
||
производительность.
|
||
|
||
Максимальный размер таблицы в 16 TB не требует чтобы операционная
|
||
система поддерживала файлы больших размеров. Большие таблицы хранятся
|
||
как множество файлов размером в 1 GB, так что ограничения, которые
|
||
накладывает файловая система не важны.
|
||
|
||
Максимальный размер таблицы и максимальное количество колонок могут
|
||
быть увеличены, если размер блока по умолчанию будет увеличен до 32k.
|
||
|
||
4.6) Как много дискового пространства в базе данных нужно для сохранения
|
||
данных из обычного текстового файла?
|
||
|
||
СУБД PostgreSQL может потребоваться дискового пространства до 5 раз
|
||
больше для сохранения данных из простого текстового файла.
|
||
|
||
В качестве примера, рассмотрим файл в 100,000 строк в каждой, из
|
||
которых целое число и текстовое описание. При этом длина текста, в
|
||
среднем, составляет 20 байт. Размер простого файла составит 2.8 MB.
|
||
Размер базы PostgreSQL, содержащей эти же данные составит
|
||
приблизительно 6.4 MB из которых:
|
||
36 байт: на каждый заголовок записи (приблизительно)
|
||
+ 24 байта: одно поле с целочисленным типом и одно текстовое поле
|
||
+ 4 байта: указатель на странице для всей записи
|
||
----------------------------------------
|
||
64 байт на запись
|
||
|
||
Размер страницы данных в PostgreSQL составляет 8192 байт (8 KB), так что:
|
||
|
||
8192 байт на страницу
|
||
------------------- = 128 записей на страницу БД (с округлением)
|
||
64 байт на запись
|
||
|
||
100000 строк данных
|
||
-------------------- = 782 страницы в БД
|
||
128 записей на страницу
|
||
|
||
782 страницы БД * 8192 байт на страницу = 6,406,144 байт (6.4 MB)
|
||
|
||
Индексы не требуют так много, но поскольку они создаются для большого
|
||
количества данных, они также могут быть велики.
|
||
|
||
Значения NULL сохраняются в битах и поэтому они занимают очень мало
|
||
места.
|
||
|
||
4.7) Как мне убедиться, что существуют нужные мне таблицы, индексы, базы
|
||
данных и пользователи?
|
||
|
||
psql имеет несколько команд, начинающихся с обратной косой черты, для
|
||
того чтобы просматривать такую информацию. Используйте \? для того,
|
||
чтобы увидеть эти команды. Также существуют системные таблицы, имя
|
||
которых начинается на pg_ и в которых также содержится эта информация.
|
||
Ещё, psql -l покажет список всех баз данных.
|
||
|
||
Также смотрите файл pgsql/src/tutorial/syscat.source. В нем
|
||
представлены многие операторы SELECT которые нужны для получения
|
||
информации из системных таблиц базы данных.
|
||
|
||
4.8) У меня медленно работают запросы или не происходит использования
|
||
индексов. Почему?
|
||
|
||
Индексы не используются для каждого запроса автоматически. Они
|
||
используются только если таблица больше минимального размера и запрос
|
||
выбирает только маленький процент записей в таблице. Так устроено,
|
||
потому что доступ к диску с применением рандомизации при сканировании
|
||
индексов может быть медленнее, чем простое чтение таблицы или ее
|
||
последовательное сканирование.
|
||
|
||
Чтобы определить необходимость использования индекса для какой-либо
|
||
таблицы, PostgreSQL должен иметь статистику по этой таблице. Эта
|
||
статистика собирается при использовании VACUUM ANALYZE или просто
|
||
ANALYZE. Используя статистику, оптимизатор узнает о том как много
|
||
записей в таблице и если он должен использовать индексы, то он может
|
||
принимать лучшие решения. Статистика также влияет на определение
|
||
оптимального порядка связывания и метода связывания. Сбор статистики
|
||
должен периодически выполнятся при изменении содержимого таблицы.
|
||
|
||
Обычно индексы не используются для ORDER BY или для выполнения
|
||
связываний. Последовательный перебор следующий за явной сортировкой
|
||
обычно быстрее, чем поиск по индексам в большой таблице. Однако, ORDER
|
||
BY часто комбинируется с LIMIT и в этом случае индекс будет
|
||
использоваться, поскольку при выполнении будет возвращаться небольшая
|
||
часть таблицы. Фактически MAX() и MIN() не используют индексы, но
|
||
индекс используется при построении запросов с ORDER BY и LIMIT:
|
||
SELECT col
|
||
FROM tab
|
||
ORDER BY col [ DESC ]
|
||
LIMIT 1
|
||
|
||
Когда используются операции с шаблонами, например LIKE или ~, индексы
|
||
могут быть использованы в следующих случаях:
|
||
* Начало строки поиска должно совпадать с началом искомой строки,
|
||
т.е.:
|
||
|
||
* LIKE шаблоны не должны начинаться с %.
|
||
*
|
||
* ~ шаблоны регулярных выражений должна начинаться на ^.
|
||
*
|
||
|
||
Строка поиска не должна начинаться с символа класса, т.е. [a-e].
|
||
|
||
Не должен использоваться поиск независимый от регистра такой как
|
||
ILIKE и ~. Вместо него используйте функциональные индексы, которые
|
||
описаны в этом FAQ ниже.
|
||
|
||
Во время initdb должна использоваться локаль по умолчанию C.
|
||
|
||
4.9) Как посмотреть на то, как оптимизатор выполняет мой запрос?
|
||
|
||
Смотрите страницу руководства посвященную EXPLAIN.
|
||
|
||
4.10) Что такое R-tree индекс?
|
||
|
||
R-tree индекс используется для индексирования пространственных данных.
|
||
Индекс хэша не может управлять поисками диапазона. B-tree индекс
|
||
управляет только поисками диапазона в одном измерении. R-tree индекс
|
||
может управлять многоразмерными данными. Например, если R-tree индекс
|
||
может быть встроен в атрибут типа point, то система может более
|
||
эффективно ответить на запрос типа "выбрать все точки внутри заданного
|
||
четырехугольника."
|
||
|
||
Канонический источник, описывающий первоначальное создание R-tree это:
|
||
|
||
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.
|
||
|
||
Вы можете найти этот документ в книге Stonebraker'а "Readings in
|
||
Database Systems".
|
||
|
||
Встроеннные R-tree могут управлять полигонами и боксами. В теории,
|
||
R-tree могут быть расширены для управления большим количеством
|
||
измерений. На практике, расширение R-tree требует некоторых усилий и у
|
||
нас, в данный момент, нет какой-либо документации о том, как это
|
||
сделать.
|
||
|
||
4.11) Что такое Genetic Query Optimizer?
|
||
|
||
Модуль GEQO производит быструю оптимизацию запроса, когда происходит
|
||
связывание многих таблиц через Genetic Algorithm (GA). Это позволяет
|
||
управлять большими запросами на связывание через неистощающий поиск.
|
||
|
||
4.12) Как мне выполнить поиск регулярного выражения и поиск независимый от
|
||
регистра букв поиск регулярного выражения? Как мне использовать индекс для
|
||
поиска независимого от регистра букв?
|
||
|
||
Оператор ~ производит поиск регулярного выражения, а оператор ~*
|
||
производит независимый от регистра букв поиск регулярного выражения.
|
||
Независимый от регистра вариант LIKE называется ILIKE.
|
||
|
||
Независимое от регистра сравнение обычно выражается так:
|
||
SELECT *
|
||
FROM tab
|
||
WHERE lower(col) = 'abc'
|
||
|
||
Эта конструкция не будет использовать стандартный индекс. Однако, если
|
||
вы создадите функциональный индекс, он будет использован:
|
||
CREATE INDEX tabindex on tab (lower(col));
|
||
|
||
4.13) Как я могу определить, что значение поля равно NULL в каком-либо
|
||
запросе?
|
||
|
||
Вы просто сравниваете значение с IS NULL и IS NOT NULL.
|
||
|
||
4.14) Каковы отличия между разными символьными типами?
|
||
|
||
Тип Внутреннее имя Замечания
|
||
--------------------------------------------------
|
||
"char" char 1 символ
|
||
CHAR(#) bpchar заполняется пустотой до фиксированной длины
|
||
VARCHAR(#) varchar размер задает максимальную длину, нет заполнени
|
||
я
|
||
TEXT text нет задаваемого верхнего ограничения или длины
|
||
BYTEA bytea массив байт переменной длины (можно использоват
|
||
ь null-байт без опаски)
|
||
|
||
Внутреннее имя вы можете увидеть, когда смотрите системные каталоги и
|
||
в некоторых сообщениях об ошибках.
|
||
|
||
Последние четыре типа являются "varlena" типами (т.е., первые четыре
|
||
байта на диске являются длинной, за которой следуют данные). Таким
|
||
образом, фактически используемое пространство больше, чем обозначенный
|
||
размер. Однако, эти типы данных также поддаются сжатию или могут быть
|
||
сохранены не в строком виде через TOAST, так что занимаемое дисковое
|
||
пространство может также быть и меньше, чем ожидалось.
|
||
|
||
CHAR() - это лучшее решение для хранения строк, которые обычно имеют
|
||
одинаковую длину. VARCHAR() - это лучшее решение, когда нужно хранить
|
||
строки переменной длины, но не превышающие определенного размера. TEXT
|
||
- это лучшее решение для строк неограниченной длины, с максимально
|
||
допустимой длиной в 1 гигабайт. BYTEA для хранения бинарных данных,
|
||
значения которых могут включать NULL байты.
|
||
|
||
4.15.1) Как мне создать поле serial/с-авто-увеличением?
|
||
|
||
PostgreSQL поддерживает тип данных SERIAL. Он автоматически создает
|
||
последовательность и индекс для колонки. Например:
|
||
CREATE TABLE person (
|
||
id SERIAL,
|
||
name TEXT
|
||
);
|
||
|
||
автоматически транслируется в:
|
||
CREATE SEQUENCE person_id_seq;
|
||
CREATE TABLE person (
|
||
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
|
||
name TEXT
|
||
);
|
||
CREATE UNIQUE INDEX person_id_key ON person ( id );
|
||
|
||
Смотрите подробности о последовательностях на странице руководства
|
||
посвященной create_sequence. Вы также можете использовать каждое поле
|
||
OID в записи как уникальное значение. Однако, если вам нужен дамп и
|
||
перезагрузка базы данных, вам необходимо использовать команду pg_dump
|
||
с опцией -o или опцию COPY WITH OIDS для сохранения значений поля OID.
|
||
|
||
4.15.2) Как мне получить значение при вставке SERIAL?
|
||
|
||
Один из способов состоит в получении следующего значения SERIAL из
|
||
объекта sequence с помощью функции nextval() перед вставкой и затем
|
||
вставлять это значение явно. Используйте таблицу-пример в 4.15.1,
|
||
чтобы увидеть как это делается в Perl:
|
||
new_id = output of "SELECT nextval('person_id_seq')"
|
||
INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
|
||
|
||
Затем вы должны также сохранить новое значение в переменной new_id для
|
||
его использования в других запросах (например таких как внешний ключ
|
||
для таблицы person). Заметим, что имя автоматически созданного объекта
|
||
SEQUENCE будет <table>_<serialcolumn>_seq, где table и serialcolumn
|
||
являются соответственно именами вашей таблицы и вашей колонки SERIAL.
|
||
|
||
В качестве альтернативы, вы можете получить назначенное значение
|
||
SERIAL с помощью функции currval() после проведения обычной операции
|
||
вставки, например
|
||
INSERT INTO person (name) VALUES ('Blaise Pascal');
|
||
new_id = output of "SELECT currval('person_id_seq')";
|
||
|
||
И наконец, вы можете использовать значение OID, возращаемое из
|
||
опертора INSERT чтобы увидеть значение по умолчанию, что
|
||
предположительно является наименее переносимым на другие платформы
|
||
решением. В Perl, используя DBI с модулеи Edmund Mergl'я DBD::Pg,
|
||
значение oid становится доступным через $sth->{pg_oid_status} после
|
||
$sth->execute().
|
||
|
||
4.15.3) Не может ли получиться так, что использование currval() и nextval()
|
||
приведет к зациклированию с другими пользователями?
|
||
|
||
Нет. Currval() возвращает текущее значение, назначенное вашем
|
||
backend'ом, а не другими пользователями.
|
||
|
||
4.15.4) Почему числа из моей последовательности не используются снова при
|
||
отмене транзакции? Почему создаются разрывы при нумерации в колонке, где я
|
||
использую последовательность/SERIAL?
|
||
|
||
Для реализации конкуретности, значения последовательностей, при
|
||
необходимости выдаются во время запуска транзакций и не блокируются до
|
||
полного выполнения транзакций. Это может вызывать разрывы в нумерации
|
||
при отмене транзакций.
|
||
|
||
4.16) Что такое OID? Что такое TID?
|
||
|
||
Поля OID служат уникальными идетификаторами записей в PostgreSQL.
|
||
Каждая запись, которая создаётся в PostgreSQL получает уникальный OID.
|
||
Все значения OID генерируемые во время initdb имеют значения меньше
|
||
16384 (из backend/access/transam.h). Все созданные пользователем OID
|
||
имеют бОльшие значение. По умолчанию, все эти OID являются уникальными
|
||
не только внутри какой-либо таблицы или базы данных, но и внутри всей
|
||
СУБД PostgreSQL.
|
||
|
||
PostgreSQL использует OID в своих внутренних системных таблицах для
|
||
связи записей и таблиц. Значения OID могут быть использованы для
|
||
идентификации заданных пользователем записей, а также использоваться
|
||
при связываниях. Рекомендуется использовать тип колонки OID для
|
||
хранения значений OID Вы можете создать индекс на поле OID для более
|
||
быстрого доступа.
|
||
|
||
Значения OID назначаются для всех новых записей из центральной
|
||
области, которые используются всеми всеми базами данных. Если вы
|
||
хотите изменить OID на какое-либо другое значение или если вы хотите
|
||
создать копию таблицы с такимиже OID, то это можно сделать так:
|
||
CREATE TABLE new_table(old_oid oid, mycol int);
|
||
SELECT old_oid, mycol INTO new FROM old;
|
||
COPY new TO '/tmp/pgtable';
|
||
DELETE FROM new;
|
||
COPY new WITH OIDS FROM '/tmp/pgtable';
|
||
|
||
OID хранится как 4-х байтное целое и не может превышать значение в 4
|
||
миллиарда. Однако, еще никто не сообщил о том, что такое произошло, но
|
||
мы планируем до того как это случиться избавится от этого ограничения.
|
||
|
||
TID используется для идентификации специальных физических записей с
|
||
блочными и offset значениями. TID изменяется после того как записи
|
||
были изменены или перегружены.
|
||
|
||
TID используется индексными записями в качестве указателя на
|
||
физические записи.
|
||
|
||
4.17) Что означают некоторые термины используемые в PostgreSQL?
|
||
|
||
Некоторый исходный код и старая документация используют
|
||
общеупотребительные термины. Вот некоторые из них:
|
||
* table, relation, class
|
||
* row, record, tuple
|
||
* column, field, attribute
|
||
* retrieve, select
|
||
* replace, update
|
||
* append, insert
|
||
* OID, serial value
|
||
* portal, cursor
|
||
* range variable, table name, table alias
|
||
|
||
Список общих терминов по базам данных можно найти на
|
||
http://www.comptechnews.com/~reaster/dbdesign.html
|
||
|
||
4.18) Почему я получаю ошибку "ERROR: Memory exhausted in AllocSetAlloc()"?
|
||
|
||
Предположительно у вас закончилась виртуальная память или что ваше
|
||
ядро имеет маленький лимит на определенные ресурсы. Попытайтесь перед
|
||
запуском postmaster выполнить следующие команды:
|
||
ulimit -d 262144
|
||
limit datasize 256m
|
||
|
||
В зависимости от командного интерпретатора shell, только одна из
|
||
данных команд выполнится успешно, но она позволит вам установить
|
||
больший сегмент данных процесса и возможно решит проблему. Эта команда
|
||
изменяет параметры текущего процесса и всех его потомков, созданных
|
||
после её запуска. Если у вас возникла проблема с SQL клиентом, потому
|
||
что backend возвращает слишком большой объем данных, попытайтесь
|
||
выполнить эту команду перед запуском клиента.
|
||
|
||
4.19) Как мне узнать, какая версия PostgreSQL запущена?
|
||
|
||
Из psql, наберите select version();
|
||
|
||
4.20) Почему при работе с моим большим объектом я получаю ошибку "invalid
|
||
large obj descriptor"?
|
||
|
||
Вам нужно при использовании большого объекта поместить в начале BEGIN
|
||
WORK и в конце COMMIT, а внутри получившегося блока lo_open ...
|
||
lo_close.
|
||
|
||
В настоящий момент PostgreSQL требует, чтобы при закрытии большого
|
||
объекта происходило выполнение транзакции. Таким образом, первая же
|
||
попытка сделать что-либо с большим объектом, не соблюдая данного
|
||
правила приведет к сообщению invalid large obj descriptor, так как код
|
||
выполняющий работу над большим объектом (по крайней мере в настоящий
|
||
момент) будет генерировать сообщение об ошибке если вы не используете
|
||
транзакцию.
|
||
|
||
Если вы используете такой интерфейс клиента как ODBC, вам возможно
|
||
понадобится установить auto-commit off.
|
||
|
||
4.21) Как мне создать колонку которая по умолчанию будет содержать текущее
|
||
время?
|
||
|
||
Используйте CURRENT_TIMESTAMP:
|
||
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
|
||
|
||
4.22) Почему мои подзапросы, использующие IN так медленно работаеют?
|
||
|
||
В настоящий момент, мы связываем позапросы для внешних запросов через
|
||
последовательный перебор результата подзапроса для каждой записи
|
||
внешнего запроса. Попробуйте заменить IN на EXISTS:
|
||
SELECT *
|
||
FROM tab
|
||
WHERE col1 IN (SELECT col2 FROM TAB2)
|
||
|
||
на:
|
||
SELECT *
|
||
FROM tab
|
||
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
|
||
|
||
Мы надеемся убрать это ограничение в будущем выпуске.
|
||
|
||
4.23) Как мне выполнить внешнее связывание?
|
||
|
||
PostgreSQL поддерживает внешнее связывание, используя стандартный
|
||
синтаксис SQL. Вот два примера:
|
||
SELECT *
|
||
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
|
||
|
||
или
|
||
SELECT *
|
||
FROM t1 LEFT OUTER JOIN t2 USING (col);
|
||
|
||
Это идентичные запросы связывания t1.col и t2.col, также возвращают
|
||
любые несвязанные записи в t1 (которые не совпадают с t2). RIGHT
|
||
связывание должно добавить несвязанные записи t2. FULL связывание
|
||
должно возвратить совпавшие записи плюс все несвязанные записи из t1 и
|
||
t2. Слово OUTER является необязательным и назначается в LEFT, RIGHT и
|
||
FULL связываниях. Обычные связывания называются INNER связывания.
|
||
|
||
В предыдущих версиях, внешние связывания могли быть эмулированы
|
||
используя UNION и NOT IN. Например, когда происходит связывание tab1 и
|
||
tab2, следующий запрос выполняет внешнее связывание двух таблиц:
|
||
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
|
||
|
||
4.24) Как выполнять запросы, использующие несколько баз данных?
|
||
|
||
Не существует способа создать запрос к базам данных отличным от
|
||
текущей. Поскольку PostgreSQL загружает системные каталоги специфичные
|
||
для базы данных, непонятно даже, как должен себя вести такой
|
||
межбазовый запрос.
|
||
|
||
Разумеется, клиент может одновременно устанавливать соедиенения с
|
||
различными базами данных и таких образом объединять информацию из них.
|
||
|
||
4.25) Как мне вернуть из функции несколько записей?
|
||
|
||
Вы можете возвращать из функций PL/pgSQL списки результатов, используя
|
||
refcursors. Смотрите
|
||
http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,
|
||
секцию 23.7.3.3.
|
||
|
||
4.26) Почему я не могу надежно создавать/удалять временные таблицы в
|
||
функциях PL/PgSQL?
|
||
|
||
PL/PgSQL кэширует содержимое функции и один из негативных эффектов
|
||
этого состоит в том, что если функция PL/PgSQL обращается к временной
|
||
таблице и эта таблица позднее удаляется и пересоздается, а функция
|
||
затем вызывается снова, то ее вызов приведет к ошибке, потому что
|
||
скэшированное содержимое функции содержит указатель на старую
|
||
временную таблицу. Чтобы решить эту проблему, используйте EXECUTE для
|
||
доступа к временным таблицам в PL/PgSQL. Использование этого оператора
|
||
заставит запрос перегенерироваться каждый раз.
|
||
_________________________________________________________________
|
||
|
||
Расширения PostgreSQL
|
||
|
||
5.1) Я написал функцию определяемую пользователем. Когда я запускаю ее в
|
||
psql, почему я получаю dump core?
|
||
|
||
Проблема может заключаться в нескольких вещах. Попытайтесь сперва
|
||
протестировать вашу функцию в отдельной самостоятельной программе.
|
||
|
||
5.2) Как я могу внести некоторые классные новые типы и функции в
|
||
PostgreSQL?
|
||
|
||
Отправьте ваши расширения в список рассылки pgsql-hackers и они по
|
||
возможности будут помещены в подкаталог contrib/.
|
||
|
||
5.3) Как мне написать C функцию, возвращающую запись?
|
||
|
||
Это требует некоего шаманства так как авторы никогда не пробовали
|
||
делать это, хотя в приницпе это возможно.
|
||
|
||
5.4) Я изменил исходный файл. Почему после перекомпиляции я не вижу
|
||
изменений?
|
||
|
||
Файлы Makefile не имеют правильных зависимостей для include файлов. Вы
|
||
должны выполнить make clean и затем make. Если вы используете GCC вы
|
||
можете использовать опцию --enable-depend в configure чтобы поручить
|
||
компилятору автоматически отслеживать зависимости.
|