【问题标题】:Moving from MySQL to to Postgres on Rails 3从 MySQL 迁移到 Postgres on Rails 3
【发布时间】:2010-09-21 08:32:03
【问题描述】:

除了删除一些 MySQL 特定查询之外,迁移非常顺利。现在的问题是,在开发过程中对数据库的查询比以前多得多。

Started GET "/profiles/data" for 127.0.0.1 at Tue Sep 21 10:26:18 +0200 2010
 Processing by ProfilesController#data as JSON
 User Load (24.3ms)  SELECT "users".* FROM "users" ORDER BY updated_at DESC LIMIT 1
 CACHE (0.0ms)  SELECT "users".* FROM "users" ORDER BY updated_at DESC LIMIT 1
 SQL (10.5ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON  a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"users"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum

每个查询都会产生 3-8 次类似上述的额外查询。发生了什么以及为什么会发生?现在的问题之一是,developement.log 臃肿且不可读。我浪费了大量时间在这些查询之间滚动寻找正确的东西......

更新:9 月 21 日星期二

这与查询类型无关。所有的查询都在产生这种愚蠢:

ree-1.8.7-2010.02 > User.first
  SQL (0.3ms)  SHOW client_min_messages
  SQL (2.0ms)  SET client_min_messages TO 'panic'
  SQL (6.3ms)  SET standard_conforming_strings = on
  SQL (18.3ms)  SET client_min_messages TO 'notice'
  SQL (15.6ms)  SET time zone 'UTC'
  SQL (17.2ms)  SHOW TIME ZONE
  SQL (23.8ms)   SELECT tablename FROM pg_tables WHERE schemaname = ANY (current_schemas(false)) 
  User Load (162.4ms)  SELECT "users".* FROM "users" LIMIT 1
  SQL (7.5ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc,
    a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid
    AND a.attnum = d.adnum WHERE a.attrelid = '"users"'::regclass AND a.attnum > 0 AND
    NOT a.attisdropped ORDER BY a.attnum 

[...] 1排成套 ree-1.8.7-2010.02 >

【问题讨论】:

  • 发布生成语句的查询。您可能正在使用一些面向 MySQL 的代码。
  • 不是这样,问题中添加了解释。

标签: ruby-on-rails postgresql ruby-on-rails-3


【解决方案1】:

我从另一个帖子中偷了这个:你可能想看看http://github.com/dolzenko/silent-postgres那个插件去掉了这些查询。出现这些日志噪音是因为 postgresql 日志级别较高。

【讨论】:

    【解决方案2】:

    您的应用程序使用第二个查询来获取有关所用数据类型的信息,并查看该列是否可以为空。如果您使用 pgAdmin3,您也会看到很多此类查询,只是为了获取结果的元数据。大多数应用程序不需要这样的查询,它在开发过程中和 pgAdmin 之类的工具中非常有用。

    【讨论】:

    • 好的,但是有没有办法在开发过程中禁用它。我现在无法追踪我的日志了。它变得非常烦人......
    • 编辑 postgresql.conf 并将 log_min_duration_statement 设置为 1000。1000 = 1000 毫秒,1 秒。您还可以将 log_min_error_statement 设置为 ERROR。您必须以超级用户身份重新加载 postgresql.conf: SELECT pg_reload_conf();您也可以重新启动数据库服务器。
    猜你喜欢
    • 2011-07-30
    • 2016-03-30
    • 2015-07-16
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2012-01-28
    相关资源
    最近更新 更多