metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-03-13 10:57 am

А теперь насчет Postgresql

Я тут таки закончил кодогенератор на F# и запустил ноччу конвертировать базу в PGSQL.
Работало оно у меня два часа на базе с 20 таблицами и около 2.5 млн объектов, в результате получилось 1.3 гига на сервере и 500 мег нескомпрессированного дампа базы.

Но больше меня интересует другой аспект.
Я сейчас снял снифером дамп взаимодействия клиента и сервера и просто пребываю в шоке. Я сделал заранее препарированный запрос, с bind-параметрами, как положено, подставляю нужные значения и делаю выполнение запроса. А оно на сервер шлет его в виде тупого плейн-текста, т.е. insert into (поля) values (все значения параметров в виде строк).

Для интереса сделал то же самое с Firebird - вроде там все культурно - т.е. сначала препаре запроса, а потом посылка хендла запроса со списком текущих параметров на на выполнение.

Потом сделал select * from table на Postgresql - тоже вроде культурно, шлет бинарный поток с данными.

Это скажите - у меня клиентский софт такой тупой, или я тупой, и сейчас insert модно делать в лоб текстом и парсить запрос с параметрами на клиентской стороне?
Причем это ж все с кучей проблем типа того, что текст запроса будет зависеть от кучи параметров локали которые нужно учитывать.

Так што текстовый бэкап PGSQL - это не обязательно сознательное решение разработчиков, а вполне может оказаться "сделано по историческим причинам, потому что всегда разговаривали с сервером в тексте". Хотя нет - счас проверил pg_dump - читает он с сервера бинарнейший дальше некуда поток.

[identity profile] vromanov.livejournal.com 2010-03-13 11:39 am (UTC)(link)
Странно. Так точно быть не должно!

Драйвер npgsql?

[identity profile] ex-vdom.livejournal.com 2010-03-13 11:47 am (UTC)(link)
The Prepare method lets you optimize the performance of frequently used queries. Prepare() basically "caches" the query plan so that it's used in subsequent calls.

Re: Драйвер npgsql?

[identity profile] metaclass.livejournal.com 2010-03-13 11:53 am (UTC)(link)
Для доступа используется libpq.dll и дельфийские компоненты PostgresDAC.
Чувствую, придется изучить api libpq.dll, я не верю, что оно не умеет слать инсерты в нормальном виде.

[identity profile] theiced.livejournal.com 2010-03-13 12:55 pm (UTC)(link)
а вот теперь расскажите как вы это делаете и чейтали ли вы http://www.postgresql.org/docs/8.4/interactive/sql-prepare.html

[identity profile] metaclass.livejournal.com 2010-03-13 01:02 pm (UTC)(link)
Т.е. prepare нужно вызывать явно? :)
Я наивно предполагаю, что если я вызываю mQuery.Prepare то это должно произойти само собой волшебным образом, как в Firebird :)

[identity profile] theiced.livejournal.com 2010-03-13 01:26 pm (UTC)(link)
в этом случае оно будет на клиенте делать вроде (клиент депендант??!). как то так. меня это особо не грузило, так что не разбираюсь.

[identity profile] metaclass.livejournal.com 2010-03-13 01:05 pm (UTC)(link)
Почитал, забавненько.
Если бы не кодогенератор, я бы сейчас свои запросы еще неделю переписывал на это дело :)

[identity profile] vp.livejournal.com 2010-03-13 04:10 pm (UTC)(link)
Дык в итоге, что это было?

[identity profile] metaclass.livejournal.com 2010-03-13 05:04 pm (UTC)(link)
Пока не знаю, нужно читать сырцы компонентов и описание API libpq.dll

[identity profile] theiced.livejournal.com 2010-03-15 02:15 am (UTC)(link)
и таки да - текстовый бэкап - решение несознательное. ибо делается как то автоматически любым вменяемым девелопером. что бы сделать бинарный бэкап - надо быть мегадолбоёбом и долго над этим думать.

[identity profile] metaclass.livejournal.com 2010-03-15 07:24 am (UTC)(link)
Ну да, бинарный сильно сложнее. Зато можно выебнуться умением делать сложные бинарные графы :)