相关疑难解决方法(0)

优化PostgreSQL以进行快速测试

我正在从SQLite切换到PostgreSQL,用于典型的Rails应用程序.

问题是PG的运行规格变得缓慢.
在SQLite上花了大约34秒,在PG上它是~76秒,这慢了2倍.

所以现在我想应用一些技术来使规范的性能与SQLite相提并论,而不需要修改代码(理想情况下只需设置连接选项,这可能是不可能的).

从头到尾有几件显而易见的事情是:

  • RAM磁盘(在OSX上使用RSpec进行良好设置会很好看)
  • 未记录的表(它可以应用于整个数据库,所以我没有更改所有脚本吗?)

你可能已经明白我不关心可靠性和其余的(DB在这里只是一次性的东西).
我需要充分利用PG并尽可能快地完成它.

理想情况下,最佳答案将描述这样做的技巧,设置和这些技巧的弊端.

更新: fsync = off + full_page_writes = off仅将时间减少到~65秒(〜-16秒).良好的开端,但远远没有34的目标.

更新2:尝试使用RAM磁盘,但性能增益在误差范围内.所以似乎不值得.

更新3:* 我找到了最大的瓶颈,现在我的规格和SQLite一样快.

问题是进行截断的数据库清理.显然SQLite在那里太快了.

为了"修复"它,我在每次测试之前打开一个事务并在结束时回滚它.

约700个测试的一些数字.

  • 截断:SQLite - 34s,PG - 76s.
  • 交易:SQLite - 17s,PG - 18s.

SQLite的速度提高了2倍.PG的速度提高4倍.

sql database postgresql performance database-tuning

196
推荐指数
2
解决办法
5万
查看次数

PostgreSQL必须出现在GROUP BY子句中,或者用在聚合函数中

我在pg生产模式下收到此错误,但它在sqlite3开发模式下工作正常.

 ActiveRecord::StatementInvalid in ManagementController#index

PG::Error: ERROR:  column "estates.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "estates".* FROM "estates"  WHERE "estates"."Mgmt" = ...
               ^
: SELECT "estates".* FROM "estates"  WHERE "estates"."Mgmt" = 'Mazzey' GROUP BY user_id

@myestate = Estate.where(:Mgmt => current_user.Company).group(:user_id).all
Run Code Online (Sandbox Code Playgroud)

postgresql production ruby-on-rails-3.1

26
推荐指数
4
解决办法
6万
查看次数