Оптимизация PostgreSQL для быстрого тестирования

Я перехожу на PostgreSQL с SQLite для типичного приложения Rails.

Проблема в том, что выполнение спецификаций стало медленным с PG.
На SQLite это заняло ~ 34 секунды, на PG это ~ 76 секунд, что более чем в 2 раза медленнее .

Итак, теперь я хочу применить некоторые методы, чтобы привести производительность спецификаций к уровню SQLite без каких-либо изменений кода (в идеале, просто установив параметры подключения, что, вероятно, невозможно).

Пара очевидных вещей, которые мне приходят в голову:

  • RAM Disk (неплохо было бы увидеть хорошую настройку с RSpec на OSX)
  • Незаблокированные таблицы (можно ли применить его ко всей базе данных, поэтому я не делаю этого) Неужели нужно изменить все сценарии?)

Как вы, возможно, поняли, меня не волнует надежность и все остальное (здесь БД - это просто пустяковая штука).
Мне нужно получить максимальную отдачу от PG и сделать его настолько быстрым, насколько это возможно .

Лучший ответ в идеале описал бы уловок для этого, настройку и недостатки этих уловок.

ОБНОВЛЕНИЕ: fsync = off + full_page_writes = off только уменьшило время до ~ 65 секунд (~ -16 секунд). Хороший старт, но далеко от цели 34.

ОБНОВЛЕНИЕ 2: Я пытался использовать RAM-диск , но прирост производительности был в пределах погрешности.Так что, похоже, оно того не стоит.

ОБНОВЛЕНИЕ 3: * Я обнаружил самое большое узкое место, и теперь мои спецификации работают так же быстро, как и SQLite.

Проблема заключалась в очистке базы данных, которая приводила к усечению . По-видимому, SQLite там слишком быстр.

Чтобы «исправить» это, я открываю транзакцию перед каждым тестом и откатываю ее в конце.

Некоторые цифры для ~ 700 тестов.

  • Усечение: SQLite - 34 секунды, PG - 76 секунд.
  • Транзакция: SQLite - 17 секунд, PG - 18.

Увеличение скорости SQLite в 2 раза. Увеличение скорости в 4 раза для PG.

196
задан the_drow 5 January 2015 в 06:01
поделиться