Почему PostgreSQL так медленно работает в Windows?
У нас было приложение g, использующее MySql. Мы обнаружили, что MySql не подходит для нашего приложения после того, как мы обнаружили, что он не поддерживает некоторые возможности GIS, которые PostGIS имеет (примечание: mysql поддерживает только поиск GIS с минимальным ограничением).
Итак, мы изменили нашу БД на PostgreSQL. Затем мы выяснили, что Postgresql 8.2 работает в Windows намного медленнее по сравнению с Mysql 5.1. Чем медленнее, я имею в виду примерно в 4-5 раз медленнее.
Почему это? Есть ли что-то в конфигурации, которую нужно изменить?
Я нашел несколько комментариев от других веб-сайтов, таких как this:
UPDATE: Мы обнаружили, что причина медленности связана с BLOB, который мы вставляем в БД. Мы должны иметь возможность вставлять BLOB с постоянной скоростью 10-15 МБ/с. Мы используем libpq lo_read и lo_write для каждого BLOB, который мы вставляем/читаем. Это лучший способ? Кто-нибудь использовал Pgsql для вставки большого BLOB с высокой скоростью раньше?
EDIT: Я слышал, что PgSql недавно был перенесен в Windows. Может ли это быть одной из причин?
Ответы
Ответ 1
Бывают случаи, когда PostgreSQL на Windows оплачивает дополнительные накладные расходы по сравнению с другими решениями из-за компромиссов, сделанных при его переносе.
Например, PostgreSQL использует процесс для каждого соединения, MySQL использует поток. В Unix это обычно не является заметной разницей в производительности, но в Windows создание новых процессов очень дорого (из-за отсутствия системного вызова fork()). По этой причине использование постоянных подключений или пула соединений гораздо важнее для Windows при использовании PostgreSQL.
Еще одна проблема, которую я видел, - это то, что ранний PostgreSQL в Windows по умолчанию будет уверен, что он пишет через кеш записи, даже если он поддерживает батарею. AFAIK, MySQL этого не делает, и это сильно повлияет на производительность записи. Теперь это действительно необходимо, если у вас есть небезопасное оборудование, например, дешевый диск. Но если у вас есть резервный кеш записи с батареей, вы хотите изменить его на обычный fsync. Современные версии PostgreSQL (конечно же, 8.3) будут по умолчанию для open_datasync, что должно устранить эту разницу.
Вы также не упоминаете о том, как вы настроили конфигурацию базы данных. По умолчанию файл конфигурации, поставляемый с PostgreSQL, очень консервативен. Если вы ничего не изменили, вам обязательно нужно взглянуть на него. Существует несколько рекомендаций по настройке, доступных на PostgreSQL wiki.
Чтобы предоставить более подробную информацию, вам нужно будет предоставить более подробную информацию о том, что работает медленнее и как вы настроили свою базу данных. Я бы предложил электронное письмо в список рассылки pgsql-general.
Ответ 2
В то время как порт PostgreSQL для Windows является относительно недавним, я понимаю, что он работает так же, как и другие версии. Но это определенно порт; почти все разработчики работают в основном или исключительно на Unix/Linux/BSD.
Вам действительно не нужно запускать 8.2 в Windows. На мой взгляд, 8.3 был первым выпуском Windows, который был действительно готовым к производству; 8.4 еще лучше. 8.2 в любом случае устаревает, и вы сможете воспользоваться несколькими преимуществами, если вам удастся обновить.
Еще одна вещь, которую стоит рассмотреть - это настройка. PostgreSQL требует большей настройки, чем MySQL, для достижения оптимальной производительности. Возможно, вам захочется рассмотреть возможность публикации в одном из списков рассылки для получения более подробной настройки.
Ответ 3
PostgreSQL уже медленнее, чем MySQL, до определенной точки (это происходит быстрее, когда у вас есть смехотворно большая база данных). Просто FYI, это не вызывает проблемы, но помните об этом.