metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-04-05 07:18 pm

Перепост, про Firebird

ссылка
В бане (или борделе, кто куда ходит), после грамотной попарки (или еще чего), распаренный партнер подсказывает генральному, что во всем виноват тормозной Firebird, и надо переходить на "промышленные" СУБД.
...
Правильно затюнигованный Firebird держит 1500 активных клиентских подключений, обслуживает 400Гб базу, и экономит предприятию как минимум от $6000 за каждый процессор.

У меня на почве Firebird когнитивный диссонанс в крайней стадии.
Во-первых, он у меня работает в количестве нескольких сотен штук у разных клиентов. Во-вторых, я на его использовании съел собаку. В третьих, у меня кодогенератор пока заточен строго под Firebird и свои модели хранит тоже в Firebird. То бишь мне по долгу службы положено всюду Firebird пропагандировать и пиарить.

Но периодически возникают срачи с разного рода админами, коллегами-программистами и прочими причастными к теме, и все они крайне не любят оный Firebird. Типа истории про неуловимый баг "если в процессе работы почитать(скопировать) базу извне сервера, то база сдохнет. Оригинал сдохнет, не копия". Ну и прочие urban legends. У людей без мозгов вообще первая реакция примерно такая: "Firebird? А, ну идите в топку, пионеры из НИИГиТ.".

Ребе [livejournal.com profile] theiced вообще убеждает меня, что базы Firebird регулярно отправляются на марс, со всеми данными :) И таки да, надо признать, такое бывало, меньше 1% случаев, но бывало. Я не знаю, как обстоят с таким дела у всяких Ораклов или PostgreSQL, но меньше 1% излечимых отказов, при жестоко удолбищных условиях эксплуатации - это имхо, вполне хорошо. Возможно, я чего-то не понимаю, и отказов вообще быть не должно.

Если посмотреть на среднего вопрощающего на sql.ru или на отвечающих ему местных "гуру", то причины такой ситуации становятся более понятны - вопрощающий обычно реально пионер из НИИГиТ, отвечающие или модераторы - несдержанные на язык красноглазики, в самом лучшем случае - делающие гешефт на Firebird и около того товарищи.

И еще один аспект - это те самые условия эксплуатации. Oracle/MSSQL - это значит заведомо нормальный сервер, инфраструктура и наличие обслуживающих админов. PostgreSQL/MySQL - наличие в дельта-окрестности следящего за инфраструктурой красноглазика.
Для Firebird же типичная инфраструктура - "первый попавшийся десктоп с виндой, с матерью на nvidia чипсете, съеденными мышами проводами, на котором кишат вирусы, админов нет, а пользователи качают с китайских серверов зоофильское порно с троянами и червями".
Я до сих пор не могу забыть, как админы клиентов базу данных бухгалтерской системы один раз удалили вместе с образом виртуальной машины, а в следующий раз, уже после переселения на физическую машину, у них просто ВЫПАЛ ПРОВОД из винчестера во время работы. Слава богу, база была на другом винчестере.

[identity profile] sgalitsky.livejournal.com 2011-04-14 10:52 am (UTC)(link)
> Вакуума нет потому что он в FB не нужен.
- почему он не нужен в fb?

[identity profile] fraks-nsk.livejournal.com 2011-04-14 11:30 am (UTC)(link)
Потому что сборка мусора осуществляется кооперативно.

Передвижение OAT/OIT и попутно сборка мусора осуществляется SWEEP - автоматом по указанному разрыву между OAT/OIT или принудительным запуском.
Поэтому вакуум не нужен.

Ну и вся база FB представляет собой один файл со страничной организацией. Пустое место от удаленных версий записей, индексов и прочего будет использовано повторно без всяких лишних телодвижений.

[identity profile] fraks-nsk.livejournal.com 2011-04-14 06:05 pm (UTC)(link)
Почитал про этот ваш VACUUM и что он делает.

В FB нет журнала/лога транзакций в понимании Pg.
Все версии записей хранятся в самой базе.
Индексы неверсионные, они видят все версии сразу.
При чтении/обновлении/удалении записей сначала определяется что же мы должны видеть а что нет, в соответствии с уровнем изоляции текущей транзакции. Ищутся все версии нужной нам записи, по ним определяется что мы должны видеть а так же есть ли транзакции которые интересуются этими версиями. Если найдены версии в которых никто не заинтересован - они удаляются, место освобождается и будет использовано впоследствии. Для того что бы при изменении записей было куда сложить версии и их не раскидывало по всей базе - обычно на каждой странице оставляется порядка 20% свободного места. Но если оно кончится - не страшно - будет любое другое свободное в базе или если его нет - добавлена новая страница. Если база только для чтения - ее можно отресторить с ключиком "не оставлять пустого места" - база будет несколько меньше.
Таким образом удаление ненужных версий происходят при каждом обращении к данным, но удаляются версии созданные не в этой транзакции. Для того что бы принудительно убрать мусор созданный в транзакции N надо в следующей транзакции прочитать данные которые были изменены в предыдущей. Например
delete from table1
а что бы все действительно удалилось надо сделать например
select count(*) from table1

Соответственно при изменении/удалении больших объемов следующие за текущей транзакции могут подтормаживать занимаясь сборкой мусора от предыдущей. Обращаю внимание что анализируются версии только тех записей к которым мы обращаемся, т.е. если после

delete from table1
из миллионной таблицы делается
select field from table1 where id = 1
то мусор собирается только для версии записи с ID=1 а не для всех записей таблицы и никакого заметного торможения не возникает.

Можно при коннекте к базе указать что этот коннект не хочет заниматься сборкой мусора - и он соответственно не будет это делать. С одной стороны это может ускорить его работу. С другой стороны если мусор никто не собирает - то это увеличивает размер базы и в итоге замедляет всех т.к. приходится просматривать много версий записей, в том числе уже никому не нужных.

Чтение всех записей бывает например при бэкапе базы. Но если бэкап надо сделать быстро и есть подозрение что в базе много мусора - можно отказаться от сбора мусора при бэкапе ключиком -G.

Версии записей могут порождаться не только изменениями но и операциями чтения, к примеру транзакциям REPEATABLE READ.

Все это я описал очень упрощенно.

Многие административные в Pg вещи в FB определяются еще на стадии написания приложения.