2009-09-04 pgsql large objects
Friday, September 4th, 2009И нещо по тема, която отдавна ме трови…
Използването на Large Objects (наричани по-нататък ебекти) в Postgres е вредно за здравето. Бавно е, криво и неудобно от почти всички гледни точки.
Да почнем с това, че е бавно. По лични наблюдения ваденето на ебект от postgres е около 3-4 пъти по-бавно от ваденето му от файловата система (понеже най-малкото трябва да се преточи през някакво IPC). Ако се работи по мрежа, да речем, че разликата е минимална на ПЪРВОТО достъпване до файла, след това има кеш (например при NFS, който аз използвам за заместител в такива случаи, и който си работи прекрасно).
Достъпването на ебект също е сравнително по-бавно (в сравнение пак с файл в директория). Би трябвало всички да са наясно, че всяка свястна файлова система размазва всяка база данни (даже тефтерчето mysql, което за някои неща има способността да е нечовешки бързо) на търсене по единичен индекс (който е директорийната структура). Аз лично още не съм видял база, дето да може да се сравни с reiserfs 3 (не съм тествал с 4 или с directory index-ите на ext4). Lookup-а във файлова система е оптимизиран за ЕДНО нещо, и то се оказва точно това, което трябва.
(няма да говоря как се реализира ебекта в postgres, страничка по страничка и т.н.)
Неудобството за работа от гледна точка на програмиста също го има, защото се работи с отделни функции да се създаде обекта, да се налее, след което OID-а му се сипва някъде като link, за да можем да стигнем до него. Ползва се базата като калпав block device, което поне аз намирам за глупаво.
А за неудобството от гледна точка на админа ако почна да говоря подробно, вероятно ще ме затворят за смущаване на обществения морал. Не може например да се каже на dump-а “сложи ми отделно ебектите”, не се поддават лесно на incremental backup (не че самата база се поддава), backup-а им е един малък ад, а възстановяването – друг такъв. Даже на свестен хардуер на човек му се иска да застреля някой – имам чувството, че еквивалентна база по размер на тая с ебектите и с индексите си се качва по-бързо…
Не знам, може в някоя друга база ебектите да са реализирани свястно и да нямам желание без да искам да ги drop-на всички, но специално в postgres са малък ужас.
(ако ги забързат и ми реализират rsync поне само за ебектите, може да си променя донякъде мнението)
(също така държа да отбележа, postgres все още ми е любимата база)
(а също така поне според мен е ВЪРХЪТ на простотията в една база да се държат ВСИЧКИ генерирани до тук PDF-и на фактури на клиенти, ама за тоя проект просто не успях да ги убедя. Поне в един друг не държим в базата видеата и картинките..)