LINUX.ORG.RU

История о PostgreSQL


0

0

По согласованию с редакцией Linux Format выложил "Введение" и "Работа с базой" - первую и вторую части из цикла "История о PostgreSQL" в открытый доступ.

Основная цель цикла - популяризация PostgreSQL как надёжного и доступного хранилища информации. Вместе со статьями выложены краткие интервью с Олегом Бартуновым и Фёдором Сигаевым - "наши" среди разработчиков PostgreSQL.

В случае проблем, вопросов, замечаний и пожеланий обращаться непосредственно автору, то есть ко мне (e-mail есть в тексте). Любые разумные предложения приму с благодарностью.

P.S. Существует проблема с отображением pdf'ов в Acrobat Reader при низких разрешениях. Автор, то есть я, в курсе этих проблем. На текущий момент обойти это можно, просматривая тексты в xpdf или в другой отличной от Acrobat Reader программе просмотра pdf.

>>> Подробности

★★★★★

Проверено: Pi ()

Корректно ли сравнивать Oracle и PostgreSQL ? Эти базы для одной и той же ниши ? Или там где вторая, первая будет пушкой по воробъям ?

anonymous
()
Ответ на: комментарий от anonymous

а чем не корректно?

единственный _принципиальный_ минус постгреса - отсутствие пакетов и, как следствие, пакетных переменых.

Pi ★★★★★
()
Ответ на: комментарий от anonymous

> Корректно ли сравнивать Oracle и PostgreSQL ? Эти базы для одной и той же ниши ? Или там где вторая, первая будет пушкой по воробъям ?

IMHO, выделять для продукта узкую нишу - убить продукт в перспективе. Для того чтобы быть конкурентным следует лезть условно во все дырки.

В частности, если отвлечься в другую сторону: PostgreSQL вполне можно использовать и в качестве записной книжки вместо :), а то кто знает во что эта книжка позже вырастет.

Evgueni ★★★★★
() автор топика

PostgreSQL и Бартунов рулят:

Олег: Все мои проекты в той или иной степени используют PostgreSQL, нашу работу поддерживает РФФИ (http://www.rfbr.ru/). Сейчас мы активно работаем по теме "Виртуальная Обсерватория". Центр находится у нас в ГАИШ и многотерабайтное хранилище там построено именно на PostgreSQL (http://vo.astronet.ru/).

:)

GladAlex ★★★★★
()

СПАСИБО! Как раз недавно думал с PostrgreSQL познакомиться, а тут такие вводные статьи!

php-coder ★★★★★
()
Ответ на: комментарий от Pi

>а чем не корректно?
все таки весовые категории разные, postgres на равных с mssql может потягатся.

>единственный _принципиальный_ минус постгреса - отсутствие пакетов и, как следствие, пакетных переменых.
а еще автономные транзакции, отслеживание зависимостей, матвью, ООП фичи, SQL (аналитические, with, merge) и много другого (для разработчика), для админа список гораздо внушительней. в принципе постгрес где-то между oracle 7 и 8 (92-98 год).

anonymous
()
Ответ на: комментарий от Pi

Я вот чего-то в документации не нашел: в PostgreSQL есть хранимые функции, хранимых процедур - нет. Может хранимая функция 
вернуть не переменную а результат SELECT-а, таблицу, как в MS SQL например - возвращается результат последнего (или нескольких) 
SELECT-ов?

Типа:
CREATE FUNCTION my_function(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
...
    SELECT * FROM my_Table
END;

GladAlex ★★★★★
()
Ответ на: комментарий от GladAlex

PL/pgSQL не единственный процедурный язык, которым можно воспользоваться.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от GladAlex

в нормальных БД в таких случаях возвращается рефкурсор. в случае Оракла есть pipelined функции, но они толком заработали с пятьдесят раз пропатченной девятки.

отсутствие процедур - имхо не проблема, т.к. тело функции может состоять из единственного null;

Pi ★★★★★
()
Ответ на: комментарий от Pi

> а поточнее? там и там та же конструкция вида begin ...; exception when... end;

Я говорил о строковых исключениях: http://www.redhat.com/docs/manuals/database/RHDB-7.1.3-Manual/prog/plpgsql-de...

но судя по документации новых версий, там уже всё цивильно. Это не может не радовать.

tailgunner ★★★★★
()
Ответ на: комментарий от Evgueni

>Может быть это: http://www.postgresql.org/docs/8.2/interactive/xfunc-sql.html. раздел 33.4.4. SQL Functions as Table Sources

Неудобно: если мне нужно вывести запрос по одной таблице, то такой подход приемлем:

CREATE TABLE foo (fooid int, foosubid int, fooname text);

CREATE FUNCTION getfoo(int) RETURNS foo AS $$
SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;

А как быть, если мне нужно вернуть результат JOIN-a по нескольким таблицам? Создавать таблицу, структура которой будет в точности повторять результат (колонки, поля) SELECT-a?! - Неудобно. Или если мне нужно вернуть результат динамического SQL, типа EXECUTE 'expression'?

GladAlex ★★★★★
()

Все это хорошо, но вот не работает mult-master репликация в pgcluster. В MySQL это включается просто и работает.

Щас пытаюсь настроить pgcluster-1.7.0_rc3, сначала вроде заработало но отказалось реплицировать bytea поля. А теперь вообще виснет на любом запросе.

И нафига вообще этот pgcluster сделали отдельным продуктом.

stephan
()
Ответ на: комментарий от anonymous

Похоже на то. Хотя компьютер живёт.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вс ждали когда лор за выходные поднимут посл ремонта , соскучились ,а тут новость ,вот и завалили машину скорей всего в апачи стоит ограничение в 5 коннектов в их

EasyLinuxoid ★★
()
Ответ на: комментарий от EasyLinuxoid

Да вроде до 90 httpd наблюдалось - это равно числу коннектов?

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от svr69

Slony это master-slave, слейв всегда ридонли, т.е. нельзя сделать HA cluster, да и реализация какая то убогая, на тригерах.

stephan
()
Ответ на: комментарий от stephan

а "не убогая" это, видимо, binary logs. позвольте поинтересоваться, в чём принципиальная убогость реализации "на триггерах" ?

AlexGor
()
Ответ на: комментарий от teodor

>IN/OUT аргументы у ф-ции тебе помогут.

Каким образом?

GladAlex ★★★★★
()
Ответ на: комментарий от Evgueni

>Я немного не понял. Это имеется в виду: 33.4.5. SQL Functions Returning Sets ?

Что-то типа того. Только в 33.4.5 указывается, что я должен задать возвращаемый тип: SETOF sometype. Вот я и спрашиваю: сначала нужно создать таблицу, которая по структуре в точности повторяет поля, возвращаемые SELECT-ом? - Если да, то это очень неудобно. А если у меня в SELECT-e присутствует JOIN или в хранимой функции идёт склейка SQL, вызов EXECUTE expression, например, и я не знаю сколько у меня вернется колонок?!

GladAlex ★★★★★
()
Ответ на: комментарий от AlexGor

Убогость в том что слейв оказывается ридонли. Но на самом деле это я конечно преувеличил, просто не понравилось то что эти тригеры не захотели вычищаться после того как я понял что Slony1 мне не подходят.

stephan
()
Ответ на: комментарий от anonymous

> Корректно ли сравнивать Oracle и PostgreSQL ?

это зависит от задачи, я в postgers'e не нашел очень многих настроек, доступных в Oracle и некоторых функций, но зато можно использовать не только PL/SQL

PS в postgers'e 8.0 есть проблема plperlu+utf8, решается заменой на 8.1

vadiml ★★★★★
()
Ответ на: комментарий от redbaron

>Всё нормально возвращается, через record.

Даже если записей, возвращаемых SELECT-ом много? А возвращаемые поля для record указывать не нужно? Если я заранее не знаю, или не хочу знать, сколько полей (колонок) мне вернёт SELECT?

GladAlex ★★★★★
()
Ответ на: комментарий от GladAlex

> Что-то типа того. Только в 33.4.5 указывается, что я должен задать возвращаемый тип: SETOF sometype.

Я этого не проверял, но IMHO

а) PostgreSQL управляется со вложенными SELECT, то есть SELECT не только от таблицы, но и от другого SELECT

б) можно сдалать view

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от GladAlex

> Даже если записей, возвращаемых SELECT-ом много?

SETOF RECORD

> А возвращаемые поля для record указывать не нужно? Если я заранее не знаю, или не хочу знать, сколько полей (колонок) мне вернёт SELECT?

нужно. либо в заголовке функции в виде OUT параметров, либо позже, при её использовании в запросе, через AS (columns list). например: select * from my_func(1, 2, '3') as (a int, b int, c text);

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

А можно ссылочку, пожалуйста, на примеры, чтобы понять лучше, а то как то это очень похоже на хак какой-то? Я очень люблю PostgreSQL, но в MS SQL (по работе сейчас приходится общаться ;) это как-то гораздо проще все: SELECT или EXEC <строка с динамическим SQL> и сколько колонок вернёт - столько вернёт и голова не болит, что в RETURN type прописывать, потому, что там есть и stored procedures, и stored functions. А иначе смысл хранимых процедур в Postgre иногда теряется, если динамический SQL запрос выполнить нельзя, то уж лучше на сторону клиента логику перекинуть. В C#, .Net, например, считается дурным тоном использовать SQL-запросы в коде: только вызов хранимых процедур, признаю - это очень удобно.

GladAlex ★★★★★
()

Молодцы, хорошее дело делаете, ребята.. ;-)

MiracleMan ★★★★★
()
Ответ на: комментарий от Ay49Mihas

>Ага, ещё бы продавалась где...

Ага! Есть у Наты дома :)

Ay49Mihas ★★★★
()
Ответ на: комментарий от GladAlex

> А можно ссылочку, пожалуйста, на примеры, чтобы понять лучше, а то как то это очень похоже на хак какой-то?

да, конечно это хак, но я не совсем понял какие примеры нужны %) если как использовать функции возвращающие setof record, то это нужно смотреть описание языка функции (plpgsql, plperl, pltcl и т.д) + синтаксис SELECT. Про SELECT могу дать: http://www.postgresql.org/docs/8.2/interactive/sql-select.html ещё можно посмотреть ветку по постгрес на sql.ru

Ещё вроде бы можно возвращать неизвестное кол-во колонок через курсоры.

> и сколько колонок вернёт - столько вернёт и голова не болит, что в RETURN type прописывать, потому, что там есть и stored procedures, и stored functions

я не понимаю принципиальную разницу между stored procedures, и stored functions %)

> А иначе смысл хранимых процедур в Postgre иногда теряется, если динамический SQL запрос выполнить нельзя, то уж лучше на сторону клиента логику перекинуть

динамический SQL запрос выполнить можно :) функция может возвращать множество строк (SETOF) и есть тип RECORD (строка с неизвестным кол-вом и типом колонок) можно их использовать одновременно (SETOF RECORD). Но есть одно "но", для того что бы выполнился запрос обрабатывающий записи с типом RECORD - парсер/оптимизатор должны знать типы колонок, как я писал выше - это можно указать в описании функции (но тогда теряется смысл динамического запроса) либо в месте вызова/использования такой функции, через AS

Eshkin_kot ★★
()
Ответ на: комментарий от GladAlex

create table a (id serial primary key, v varchar(16));
create table b (id int references a(id) not null, n varchar(16));
CREATE FUNCTION test123(q text) RETURNS SETOF record
AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN EXECUTE q LOOP
return next r;
end loop;
return;
END
$$
LANGUAGE plpgsql;
select * from test123('select * from a join b on (a.id = b.id)') as (a int, b varchar, c int, d varchar);
a | b | c | d
---+---+---+-----
1 | a | 1 | aaa
1 | a | 1 | bbb
1 | a | 1 | ccc
2 | b | 2 | ---
2 | b | 2 | +++
2 | b | 2 | ===
3 | c | 3 | zzz
3 | c | 3 | xxx
3 | c | 3 | yyy
(записей: 9)

Eshkin_kot ★★
()
Ответ на: комментарий от GladAlex

> Вот я и спрашиваю: сначала нужно создать таблицу, которая по структуре в точности повторяет поля, возвращаемые SELECT-ом?

Не обязательно, можно создасть тип: create type mytype (a int, b varchar(20))
http://www.postgresql.org/docs/8.2/interactive/sql-createtype.html

а в функции описать returns setof mytype

а можно воспользоваться in/out параметрами, как в этом примере:
http://sql.ru/forum/actualthread.aspx?tid=303462&hl=refcursor#2815749

Reinventer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.