慢于ActiveRecord / Postgres查询不利用索引 -- ruby-on-rails 领域 和 postgresql 领域 和 activerecord 领域 相关 的问题

Slow activerecord/postgres query not utilizing index


简体版||繁體版
0
vote

问题

中文

我有一个 Messages 表与 user_id 字段(String)。对于全部唯一用户的查询非常慢,超过一百万条记录。

  Message.where(created_at: start_date..end_date).select(:user_id).distinct(:user_id).count => (120145.6ms)  SELECT DISTINCT COUNT(DISTINCT "messages"."user_id") FROM "messages" WHERE ("messages"."created_at" BETWEEN '2016-05-14 04:00:00.000000' AND '2016-06-13 03:59:59.999000')   

我有索引 user_id & created_at ,但postgres似乎没有它们:

schema

  add_index "messages", ["user_id"], name: "index_messages_on_user_id", using: :btree add_index "messages", ["created_at"], name: "index_messages_on_created_at", using: :btree      

pg解释

                                                                          QUERY PLAN -----------------------------------------------------------------------------------------------------------------------------------------------------------------  HashAggregate  (cost=56111.04..56291.89 rows=18085 width=29)    Group Key: user_id    ->  Seq Scan on messages  (cost=0.00..52215.65 rows=1558153 width=29)          Filter: ((created_at >= '2016-05-14 04:00:00'::timestamp without time zone) AND (created_at <= '2016-06-13 03:59:59.999'::timestamp without time zone)) (4 rows)   

为什么未使用索引?用于加速查询的任何提示?

英文原文

I have a Messages table with user_id field (string). A query for total unique users is extremely slow with over a million records.

Message.where(created_at: start_date..end_date).select(:user_id).distinct(:user_id).count => (120145.6ms)  SELECT DISTINCT COUNT(DISTINCT "messages"."user_id") FROM "messages" WHERE ("messages"."created_at" BETWEEN '2016-05-14 04:00:00.000000' AND '2016-06-13 03:59:59.999000') 

I have indexes on user_id & created_at, but postgres doesn't seem to use them:

Schema

add_index "messages", ["user_id"], name: "index_messages_on_user_id", using: :btree add_index "messages", ["created_at"], name: "index_messages_on_created_at", using: :btree    

PG Explain

                                                                        QUERY PLAN -----------------------------------------------------------------------------------------------------------------------------------------------------------------  HashAggregate  (cost=56111.04..56291.89 rows=18085 width=29)    Group Key: user_id    ->  Seq Scan on messages  (cost=0.00..52215.65 rows=1558153 width=29)          Filter: ((created_at >= '2016-05-14 04:00:00'::timestamp without time zone) AND (created_at <= '2016-06-13 03:59:59.999'::timestamp without time zone)) (4 rows) 

Why are the indexes not used? Any tips for speeding up the query?

        

回答列表

0
 
vote

索引可能没有足够的选择性,因此Postgres决定它需要读取整个表。对于您的查询,我将推荐索引 messages(created_at, user_id) 。将鼓励Postgres使用索引而不是原始数据,因为它是覆盖索引。

另一个想法是制作 created_at (或 99887668 )一个群集索引。这可能不会影响插入性能,因为新记录对于 created_at 并在末尾具有更高的值。这将减少I / O.

 

The index is probably not selective enough, so Postgres decides that it would need to read the entire table. For your query, I would recommend an index on messages(created_at, user_id). Postgres would be encouraged to use the index instead of the raw data, because it is a covering index.

Another idea would be to make created_at (or created_at, user_id) a clustered index. This probably will not affect insert performance, because new records would have higher values for created_at and go at the end anyway. This would reduce I/O.

 
 
         
         

相关问题

240  Rails Rake任务是否可以访问ActiveRecord型号?  ( Do rails rake tasks provide access to activerecord models ) 
我正在尝试创建一个自定义rake任务,但似乎我没有访问我的模型。我认为这是含有rails任务的东西。 我在lib / tasks / test.rake中有以下代码: namespace :test do task :new_task do puts Parent.all.inspect end ...

1  如何构建Rails链接,以便单击它将更新ActiveRecord属性  ( How to structure rails link so that clicking it will update an activerecord attr ) 
我有两个型号,属性模型和应用模型。应用程序has_many属性,属性属于_to应用程序。因此,属性模型具有"application_id" 字段,它表示与属性关联的应用程序。 我想在property show page上显示一份所有可能的应用程序的列表,其中包含应用程序的链接,如果单击,将简单地将属性模型中的appl...

6  Rails ActiveRecord Serialize方法在测试环境中不起作用  ( Rails activerecord serialize method doesnt work in test environment ) 
我遇到了activeRecord serialize 方法我的测试。 它只是给了我纯的字符串而不是我的数据数组。 示例: User > ActiveRecord::Base serialize :roles, Array end 控制台: u = User.new u.roles = ["adm...

3  自定义ActiveRecord查找器调用命名范围?  ( Custom activerecord finder invoking named scopes ) 
我有一个定义的定制查找器: class ContainerGateIn << ActiveRecord::Base ... def self.search(text) result = if text text.split(' ').inject(self) do |result, c...

1  我可以在2个不同的表字段中汇总值,并通过Rails / Active Record排序该值吗?  ( Can i sum values in 2 different table fields and sort on that value via rails ) 
我有逾期和捐赠模型。我想通过总计+捐款列出成员。这是活动的记录是否可以专门,或者我必须在应用程序中进行一些添加和排序代码? db是postgres ...

1  使用ActiveRecord找到5个嵌套表的结果  ( Use activerecord to find result of 5 nested tables ) 
我有一个用户型号(:姓名,:密码,电子邮件)和事件模型(:name,:等)和兴趣模型(:name) 然后我创建了两个加入表 - &gt;用户记录和活动情绪;每个都不包含主键,并且仅包括user_id / exing_id和event_id / exing_id。 我正在尝试使用astiveRecord来查询列出兴趣事...

0  在项目中难以使用ActiveMerchant,这些项目不使用ActiveRecord作为它的ORM?  ( Difficult to use activemerchant in a project that does not use activerecord as i ) 
ActiveMerchant似乎被同意烘烤。 我基于购买()方法返回ActiveRecord :: Billing ::响应对象: 是正确的,如果是这样,这是否意味着难以在使用不同的Ruby ORM(续集/ DataApper)的项目中使用ActiveMerchant? ...

1  有条件地覆盖Activerecord的删除机制是什么是最好的方法?  ( Whats the best way to conditionally override activerecords deletion mechanism ) 
我试图劫持rails的删除机制,使其对某一组模型不同。 两个 ActiveRecord::Base#delete 和 #destroy #destroy 引线回到 ActiveRecord::Relation#delete_all ,因此覆盖此方法会有意义。 我已经尝试过... class MyModel...

1  HOWTO处理ActiveRecord 3.0.4和DB_Chereaner的嵌套事务  ( Howto handle nested transaction with activerecord 3 0 4 and db cleaner ) 
我们正在使用db_cleaner使用Clean Method :transaction 在Rails 3.0.4应用程序(我们无法升级)mysql 5.x db。我们无法使用 :truncation ,导致我们松散的种子数据。 现在我们面临以下问题。 ActiveRecord自动生成一个事务,当例如 :create...

0  Rails迁移以生成日历表  ( Rails migration to generate a calendar table ) 
如何在Rails迁移上编写Ruby以生成日历表,其中包含2010年1月至12月2099年1月之间的所有日期? ...

8  Rails:显示@CARS作为逗号分隔的列表  ( Rails display cars as a comma separated list ) 
基于此查询: @cars = Car.where("manufacturer_id IN ?", @mfts.select("id")).limit(30).select("id") 如何在这样的视图中显示汽车的ID(或者我需要重写我的查询)? 3,2,5,12,15,24,34,63,64,65,66...

1  在Rails中,您如何将这两个不同的HAS_MANYS合并为一个?  ( In rails how would you merge these two different has manys into one ) 
让我们说我们有一个用户。 用户通过账户_many文档如此... class User < ActiveRecord::Base belongs_to :account has_many :documents, :through => :account, :order => "created_at DES...

0  轨道3的陈旧Activerecord协会的问题  ( Problem with stale activerecord association in rails 3 ) 
我有三种型号:网站,订阅,计划: 网站 E.g value = test, _dff = 323, 0 订阅 E.g value = test, _dff = 323, 1 计划 E.g value = test, _dff = 323, 2 在我的订阅范围控制器中,我首先加...

1  yii,生成Unque ID的每个TR元素的CGridView  ( Yii generate unquie ids one each tr element of cgridview ) 
我有一个cdbactiverecord设置,我有一个cgridview类设置为小部件的实例。 基本上我的结局游戏是我需要一个表,但每行都包含与活动记录关联的行的主键。 如: package be.gillescoeman.scubajournal; // import android.app.Fragm...

0  Rails 3 - 拥有和“跟踪”相同的对象类型使用has_many和has_many作为:可跟踪(多态)  ( Rails 3 owning and tracking the same object type using has many and has many ) 
在我的项目中,我需要 User 能够"创建/拥有" 它自己的对象和"跟踪" (或"关注" )由其他用户创建的对象。这是我的方法: class User < ActiveRecord::Base has_many :widgets has_many :gadgets has_many :nuggets ...

2  Ruby在Rails上的自动保存选项  ( Autosave options in ruby on rails ) 
有没有办法在轨道中关闭自动保存?我不希望修改关联以自动保存到数据库,直到我调用保存在父对象上。 some_parent.some_children << child #should not save, just adds to the association! some_parent.save #now pa...

0  @ user.visit_count =>未定义的方法  ( User visit count undefined method ) 
我正在做我想的是非常简单的东西 - 找到一个用户并递增整数。 recording.wav6 我收到以下错误: recording.wav7 这似乎是一个轨道3件事 - 我在哪里出错了? ...

0  mysql查询哪里......或...快捷方式  ( Mysql query where or shortcut ) 
是否有用于编写以下MySQL查询的快捷方式?我正在寻找一种压缩的速记 SELECT * FROM `listings` where `bedroom` = 1 OR `bedroom` = 2 因为我想更容易动态构建PHP中的MySQL查询。类似于 WHERE bedroom = 1, 2 ,因为我从php...

0  在Rails 3中加入一对多协会与许多多对多协会  ( Joining a one to many association with a many to many association in rails 3 ) 
我在用户类和表类之间有多对多关联。此外,我在用户和表格之间有一对多关联(一个用户最终拥有该表)。我正在尝试访问用户可以访问的所有表(基本上加入两个关联)。 另外,使用named_scope(现在的范围)是很好的。 这是我到目前为止的内容: class User < ActiveRecord::Base act...

0  获取用户的ID,在数据库中搜索他/她的名字  ( Getting the id of a user after searching for his her name in the database ) 
所以当用户完成测验时,他/她填写了他/她的姓名和电子邮件。在提交时,我需要在用户DB中创建用户,以及在相关答案DB中存储个人答案。显然,对于Contact_ID字段,我需要输入联系人的ID:name =&gt; params [:name]。当我on tack时。在声明结束时我得到"无方法错误ID" 。当我在视图中时...

1  使用ROR使用e-a-v的传统表  ( Using ror with a legacy table that uses e a v ) 
我需要连接到传统数据库并从使用实体属性值模型的表中提取数据的子集来存储联系人的信息。该表看起来如下: SubscriberID FieldID数据 1 2杰克 1 3个麻雀 2 2丹 2 3史密斯 其中 fieldid 是一个外键到 fields 表格,列出给定客户可以拥有的自定义字段(例如,名字,姓氏,电话)。...

2  尝试访问Join Table Rails中的属性  ( Trying to access attribute in join table rails ) 
好的我认为我有两个需要修复的问题 我有以下表格: Student , Register Register Register 和一个连接表,它显示1 register有许多学生的记录,称为"regisers_students" ,看起来像这样:. 我必须通过 rails g migration CreateS...

1  如何在轨道上连接两个ActiveRecord查询  ( How to concatenate two activerecord queries in rails ) 
我有一个简单的应用程序,具有用户模型,角色模型,带收件人的消息模型。 用户通过角色具有许多邮件 并且一个角色通过收件人和用户通过收件人的消息也有许多消息。 收件人模型具有user_id,core_id和message_id 现在我想在一个查询中显示用户的所有邮件,包括他的角色消息和他的个人信息。如何完成此操作。 ...

2  我应该扩展这个课吗? (PHP)  ( Should i be extending this class php ) 
我在php中创建一个orm,我有一个类'orm',基本上创建了与数据库表对应的对象(我的目标是与activerecord模式类似于/相同的功能。)ORM它本身扩展了"数据库" ,它设置了数据库连接。 所以,我可以拨打电话: $c = new Customer(); $c->name = 'John Smith'; ...

0  如何获得多功能者模型,只有1个连接查询在yii2中?  ( How to get multi activerecord model with only 1 join query in yii2 ) 
例如: 查询 SELECT book.*,author.* FROM book INNER JOIN author ON author.id = book.author_id WHERE book.id=1 获取模型 $modelBook = Book::find()->innerJoin...

相关问题

240  Rails Rake任务是否可以访问ActiveRecord型号? 
1  如何构建Rails链接,以便单击它将更新ActiveRecord属性 
6  Rails ActiveRecord Serialize方法在测试环境中不起作用 
3  自定义ActiveRecord查找器调用命名范围? 
1  我可以在2个不同的表字段中汇总值,并通过Rails / Active Record排序该值吗? 
1  使用ActiveRecord找到5个嵌套表的结果 
0  在项目中难以使用ActiveMerchant,这些项目不使用ActiveRecord作为它的ORM? 
1  有条件地覆盖Activerecord的删除机制是什么是最好的方法? 
1  HOWTO处理ActiveRecord 3.0.4和DB_Chereaner的嵌套事务 
0  Rails迁移以生成日历表 
8  Rails:显示@CARS作为逗号分隔的列表 
1  在Rails中,您如何将这两个不同的HAS_MANYS合并为一个? 
0  轨道3的陈旧Activerecord协会的问题 
1  yii,生成Unque ID的每个TR元素的CGridView 
0  Rails 3 - 拥有和“跟踪”相同的对象类型使用has_many和has_many作为:可跟踪(多态) 
2  Ruby在Rails上的自动保存选项 
0  @ user.visit_count =>未定义的方法 
0  mysql查询哪里......或...快捷方式 
0  在Rails 3中加入一对多协会与许多多对多协会 
0  获取用户的ID,在数据库中搜索他/她的名字 
1  使用ROR使用e-a-v的传统表 
2  尝试访问Join Table Rails中的属性 
1  如何在轨道上连接两个ActiveRecord查询 
2  我应该扩展这个课吗? (PHP) 
0  如何获得多功能者模型,只有1个连接查询在yii2中? 



© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有