2个类似的表,带有索引的category_id - 由Postgres生成的2个不同的查询

时间:2018-05-13 21:15:53

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

我正在使用:Rails 3.2.13和PostgreSQL 9.4.7

我有2个产品表,from sys import getsizeof >>> arr2 = np.ones((1000,1000)) >>> getsizeof(arr2) 8000112 >>> arr2 = np.ones((1000,1000),dtype='>i2') >>> getsizeof(arr2) 2000112 AProducts两个表都有一个BProducts.整数,它是一个索引列,两个表都有几百万个记录。

当我通过category_id查询AProducts时,响应很快并且使用索引,但是当我查询category_id时,响应非常慢,并且它使用顺序扫描代替使用索引。我试图找出BProducts发生这种情况的原因,因为表格和模型几乎是BProducts的理想选择。以下是EXPLAIN的结果:

AProducts

上面的慢查询需要219696.7ms,并且不使用索引。以下针对AProduct的查询很快,并且使用索引。

irb(main):2290:0> BProduct.where(:category_id => 700).explain

  BProduct Load (219696.7ms)  SELECT "b_products".* FROM "b_products" WHERE "b_products"."category_id" = 700
  EXPLAIN (1.3ms)  EXPLAIN SELECT "b_products".* FROM "b_products" WHERE "b_products"."category_id" = 700
=> "EXPLAIN for: SELECT \"b_products\".* FROM \"b_products\"  WHERE \"b_products\".\"category_id\" = 700\n                                 QUERY PLAN\n-----------------------------------------------------------------------------\n Seq Scan on b_products  (cost=0.00..1791663.25 rows=926 width=2036)\n   Filter: (category_id = 700)\n(2 rows)\n"

我想弄清楚的是,我如何让我的BProduct查找使用索引并以与AProduct相同的速度获取记录,为什么不能默认行为I&#39我看到了?

1 个答案:

答案 0 :(得分:0)

也许您的表格没有真正编入索引?

在rails控制台上检查:ActiveRecord::Base.connection.indexes(:table_name)

您也可以直接在postgres上执行此操作:SELECT indexname FROM pg_indexes;