Я перехожу к PostgreSQL из SQLite для типичного приложения Rails.
Проблема в том, что запущенные спецификации стали медленными с PG.
На SQLite потребовалось ~ 34 секунды, на PG - ~ 76 секунд, что больше, чем 2x медленнее.
Итак, теперь я хочу применить некоторые методы к , чтобы обеспечить производительность спецификаций на уровне SQLite без изменений кода (в идеале, просто установив параметры подключения, что, вероятно, невозможно).
Несколько очевидных вещей с головы:
- RAM Disk (хорошая настройка с RSpec на OSX была бы хорошей, чтобы видеть)
- Unlogged tables (может ли он применяться ко всей базе данных, поэтому у меня нет изменений всех скриптов?)
Как вы, возможно, поняли, что меня не интересует надежность, а остальное (DB - всего лишь одноразовая вещь).
Мне нужно максимально использовать PG и сделать его настолько быстрым, насколько это возможно.
Лучший ответ идеально описывает трюки для этого, настройки и недостатки этих трюков.
UPDATE: fsync = off
+ full_page_writes = off
уменьшено время до ~ 65 секунд (~ -16 секунд). Хорошее начало, но далеко от цели 34.
ОБНОВЛЕНИЕ 2: я попытался использовать RAM-диск, но прирост производительности был в пределах ошибки. Так что, похоже, не стоит того.
ОБНОВЛЕНИЕ 3: * Я нашел самое узкое место, и теперь мои спецификации работают так же быстро, как SQLite.
Проблема заключалась в очистке базы данных, которая выполняла усечение. По-видимому, SQLite слишком быстро там.
Чтобы "исправить", я открываю транзакцию перед каждым тестом и откатываю ее в конце.
Некоторые номера для ~ 700 тестов.
- Усечение: SQLite - 34s, PG - 76s.
- Транзакция: SQLite - 17s, PG - 18s.
2x увеличение скорости для SQLite. 4-кратное увеличение скорости для PG.