Может кто подскажет, я заметил у Postgresql такую фичу (багу?)
Есть две таблицы, допустим
CREATE TABLE tbl_a (
id INT PRIMARY KEY
);
CREATE TABLE tbl_b (
ref INT REFERENCES tbl_a(id) ON DELETE CASCADE ON UPDATE CASCADE
);
У tbl_b есть тригер на BEFORE DELETE, который иногда НЕ возвращает OLD при удалении (из-за неких условий).
Так вот, если сделать DELETE FROM tbl_a WHERE id = xxx,
при этом, когда в каскадном удалении будут удаляться записи из tbl_b, и тригер вернет неуспех, то из tbl_a запись удалиться, а в tbl_b останется.
Таким образом целостность базы вроде как нарушается. Я думал оно все в одной транзакции работает и удаление из tbl_a должно откатиться, если тригер в tbl_b вернет неуспех.
Что-то не правильно? Лучше сначала правильно и ортогонально, с продуманой архитектурой, хорошей масштабируемостью и приличным функционалом. Оптимизация тогда - дело житейское, показатель качества, тогда как ранняя оптимизация зарыла не один проект.
О! Недавно сам перелез на postgres. Кстати может кто знает, в убунтушной сборке после отката транзакции в mysql данные остаются, подключаю аналогичный mysql на другой машине (виндовой) - всё ок, меняю DataSource на сабж - всё ок. Это и послужило толчком к переходу на postgres.
>KRoN73 - для embedded есть SQLite и хорошо так есть :)
H2 - Pure Java и может быть полностью включён в проект. Автономным .jar А SQLite потребует биндингов и таскания с собой sqlite-либ, разных для винды и для Linux. Придётся делать два разных дистра.
>Кстате - to любителю "померить скорость" - этот малыш порвет всех!
По тестам sqlite капитально сливает на параллельных запросах.
> Может PostgreSQL и лучше, но баблос пилить на MSSQL намного эффективней. Факт.
это люди не знаю как пилить бабло. На MSSQL в любом случае большая часть перепадёт MS, а с PostgerSQL/MySQL можно 95% загрести себе (5% -- это обналичка)
Недавно тестил postgresql 8.2.6 с помощью встроенной утилиты pgbench. Сначала поставил fedora 8 (i386) собрал postgres, сделал несколько прогонов теста ... затем поставил fedora 8 (x86_64) и сделал тоже самое. Машина использовалась одна и таже. Для чистоты экперимента все сервиса заглушил в обоих случаях. В общем на i386 (x86_32) показатели производительности были существенно лучше чем на x86_64. Слегка удивился ... В общем в плане повышения производительности есть куда копать.
>это люди не знаю как пилить бабло. На MSSQL в любом случае большая часть перепадёт MS, а с PostgerSQL/MySQL можно 95% загрести себе (5% -- это обналичка)
Да вот не только. Например, самая распростаненная система с БД - 1С. Не далее месяца назад выслушивал от франчайзи, что они, конечно(а как же), смотрели постгрес, но это небольшое поделие для маленьких конторок компов на 5-ть, а мсскл - это сила, это ИМЯ, ПРОВЕРЕННЫЙ БРЭНД, вот его они нам и продадут, со скидкой. ) И слово ПРОВЕРЕННЫЙ БРЭНД - главное для моего начальства (
>Недавно тестил postgresql 8.2.6 с помощью встроенной утилиты pgbench. Сначала поставил fedora 8 (i386) собрал postgres, сделал несколько прогонов теста ... затем поставил fedora 8 (x86_64) и сделал тоже самое. Машина использовалась одна и таже. Для чистоты экперимента все сервиса заглушил в обоих случаях. В общем на i386 (x86_32) показатели производительности были существенно лучше чем на x86_64. Слегка удивился ... В общем в плане повышения производительности есть куда копать.
А пробовали тоже самое на бинарниках с репозитария или оффсайта? Собрать, оно, знаете, по разному получается, тут контрольный бенч относительно готовых бинарников нужен. Я использую и в работе и x86_64, и x86_32, бинарники, чтобы именно _существенные_ отличия были не замечал. Хотя особо и не сравнивал.
Интересно, а хоть одна астрономическая БД на этом проверенном бренде крутится? А это Вам не хухры-мухры - конторы любых размеров нервно крят в сторонке против баз с такими размерами. В случае PostgreSQL с этим всё тип топ - искать в сторону Олега Бартунова.
>Интересно, а хоть одна астрономическая БД на этом проверенном бренде крутится? А это Вам не хухры-мухры - конторы любых размеров нервно крят в сторонке против баз с такими размерами. В случае PostgreSQL с этим всё тип топ - искать в сторону Олега Бартунова.
Это я и без вас знаю, и кто такой Бартунов знаю, и что такое постгрес хорошо знаю - пять лет решения на нем строю, разные, астрономией не увлекался, но ГИС-подсистема была. Но слово "ПРОВЕРЕННАЯ СУБД" сказанное представительным молчелом в "ачках, кастюме и галстуке" весит куда больше моего, и галстук я не ношу. ПО _продавать_ надо, от начала и доконца, как докторскую, и тут играют первоочередную роль другие факторы нежели его качество.
> Интересно, а хоть одна астрономическая БД на этом проверенном бренде крутится?
Крутяться - в США. Часть базы Олега конвертирована из MSSQL - около 2Тб. Это был просто праздник жизни: загрузить 2Тб архива в MSSQL и сдампить в pgsql. Операция заняла около двух недель.
>>Неоптимально, но качественно? :) сильно сказано.
> Что-то не правильно? Лучше сначала правильно и ортогонально,
А это как?
> с продуманой архитектурой, хорошей масштабируемостью и приличным функционалом.
Пример был - полная выборка с сохранением результатов на диск, для того чтобы после отобрать диапазон - это продуманная архитектура и хорошая масштабируемость?
>Пример был - полная выборка с сохранением результатов на диск, для того чтобы после отобрать диапазон - это продуманная архитектура и хорошая масштабируемость?
Да. Ничего в синтаксисе и АПИ не поменялось, а в новом мажорном релизе операцию оптимизировали, прежде оптимизации мешали, по всей видимости, какие-то общие абстрактные структуры, в самом общем виде реализованые.
>Объём сам по себе не имеет значения - данные лежат себе на диске и лежат, если их не трогать. А что с характером запросов к базе?
Данные умеют лежать на диске по разному. Постгресу бы умение юзать raw-девайсы, оптимизировать движение головок, и организовывать самостоятельно полный дисковый кэш - было бы нереально здорово.
>> Что-то не правильно? Лучше сначала правильно и ортогонально, >А это как?
Неправильно работающая программа не нужна никому, даже если она работает быстро.
> Пример был - полная выборка с сохранением результатов на диск, для того чтобы после отобрать диапазон - это продуманная архитектура и хорошая масштабируемость?
Так никогда не было. При использовании LIMIT и ORDER BY было два варианта поведения постгреса:
1) Полная сортировка рез-татов выборки и выдача необходимых по LIMIT
2) Если ORDER BY совпадает с индексом, то шаг сортировки мог отсутствовать (именно мог, естьь ситуации где постгрес не использует такой индекс)
Сейчас появился третий способ: Top-N sort. Идея его проста - что бы получить первые десять рез-татов по ORDER BY совершенно не требуется сортировать всю выборку, достаточно просмотреть всю выборку и отобрать первые 10 рез-татов. То есть, первый способ требует время ~ M*log(M), где М - число результатов в выборке, а новый при N<<M - ~M.
> Данные умеют лежать на диске по разному. Постгресу бы умение юзать raw-девайсы, оптимизировать движение головок, и организовывать самостоятельно полный дисковый кэш - было бы нереально здорово.
В современном мире используются RAID'ы - не науправляешься из базы.
> В общем на i386 (x86_32) показатели производительности были существенно лучше чем на x86_64. Слегка удивился ...
Сайбейз, к примеру, честно и осторожно писал (для 32 и 64 битных версий под солярис), что при объемах памяти меньше 4Г 64-битная версия не дает преимуществ и в некоторых случаях может работать медленнее.
Хотя Оракл, например, на сайте пишет что использование 64 битной архитектуры позволяет обрабатывать вдвое больше данных за такт и дает прирост производительности до 2-х раз :)
>Любыми. И на SSD тоже. Все это требует своей оптимизации, совершенно неподъемная задача для широкого спектра используемых средств хранения.
Это с нуля или оспользуя наработки open source? Я не призываю курочить постгрес, но отдельный проект, который бы слил ОС с СУБД был бы интересен. Шо, помечтать нельзя? :)
> Это с нуля или оспользуя наработки open source? Я не призываю курочить постгрес, но отдельный проект, который бы слил ОС с СУБД был бы интересен. Шо, помечтать нельзя? :)
"Слиять" постгрес и ОС бессмысленно - что бы получить выигрыш от управления дисками самим постгресом, нужно писать свой аналог FS - с заточками под базу и ее особенностями хранения. Да еще и учитывающую собственно характеристики железки. Например: постгрес складывает таблицы гигабайтными файлами (что бы не бороться с ограничениями FS на размер файла). В оптимизированной FS имеет смысл сразу резервировать этот гиг - что бы sequence scan читал блоки последовательно. Но для SSD можно так не напрягаться - random seek у них много дешевле. С другой стороны, зачем тогда вообще оставлять нарезку?
Индексы вообще очень редко читаются последовательно (фактически, только ваккум их так читает) и им такие оптимизации не нужны. Зато было бы полезно логически близкие страницы индекса хранить близко.
Данные ничего не имеют. И пока их никто не трогает на производительности их объём не сказывается.
> Постгресу бы умение юзать raw-девайсы, оптимизировать движение головок, и организовывать самостоятельно полный дисковый кэш - было бы нереально здорово.
Ну-ну.. Любопытно будет посмотреть на того, кто оптимизирует движение головок во внешнем аппаратном рейде.
> Например: постгрес складывает таблицы гигабайтными файлами (что бы не бороться с ограничениями FS на размер файла). В оптимизированной FS имеет смысл ...
Имхо. Об этом вообще имеет смысл говорить только в условиях когда вся БД лежит на одном-двух дисках. Иначе наличие буферного кеша БД, кеша дисковых массивов и использование рейдов сводят эту оптимизацию на нет.
Про raw-девайсы, похоже гёрла просто слабо себе представляет в чем их преимущество.
Ну да. У 1-го варианта с сортировкой есть некоторые проблемы. Если данные для сортировки не помещаются в work_mem то и происходит сброс результатов выборки на диск. При этом, limit/sort находится в верху плана исполнения запроса (если нет подзапросов), что может быть сильно не оптимально. Вот например два запроса, дающих одинаковый результат:
1) select comments.id, msgbase.message from comments, msgbase where comments.id=msgbase.id and comments.id in (select id from comments where postdate>(CURRENT_TIMESTAMP-'1 year'::interval) order by title limit 10) order by title;
2) select comments.id, msgbase.message from comments, msgbase where msgbase.id=comments.id and postdate>(CURRENT_TIMESTAMP-'1 year'::interval) order by title desc limit 10
Только первый исполняется 20 секунд, а второй - 204 секунды. В запросах специально выбрана сортировка по полю title по которому нет индекса.
Если сортировать по полю на который есть индекс, то все встает на свои места (2-й выполняется быстрее).
> Имхо. Об этом вообще имеет смысл говорить только в условиях когда вся БД лежит на одном-двух дисках. Иначе наличие буферного кеша БД, кеша дисковых массивов и использование рейдов сводят эту оптимизацию на нет.
>Про raw-девайсы, похоже гёрла просто слабо себе представляет в чем их преимущество.
Об Оракле? Прирост в записи, возможность асинхронного io... ммм... а так да, слабовато. В контексте СУБД-ОС - возможность содания оптимизированной под СУБД ФС.
Да, порядок сортировки во втором запросе я случайно поменял, на время выполнения оно не влияет. Ограничение по postdate добавлено чтобы снизить время выполнения запросов.
У меня 8.2, 8.3 я еще не пробовал. Насколько я понимаю, работа 1-го варианта осталась без изменений, но теперь кроме второго если еще и 3-й, который как раз и предназначен для ситуаций когда количество строк в LIMIT небольшое, а количество строк в выборке велико.
>На IBMовском железе по IBMовской цене, с IBMовской поддержкой по IBMовской цене? :)
Ну дык! Но зато именно то, что заказывали - ОС-СУБД. Уже 20 лет как... Да и в плюс - .NET-подобное ядро системы и Java на уровне ядра. В общем, вкусно, коли денег хватит :-)