加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Postgres索引对原始SQL与ActiveRecord查询的影

发布时间:2020-12-17 01:56:10 所属栏目:百科 来源:网络整理
导读:我有一个150k名称的表,并尝试添加索引降低(名称)以加快查找速度.该索引将原始SQL查询加速大约x100,但使用ActiveRecord执行的相同查询不受影响,如果不是慢一点. 这些是查询: NamedEntity.where("lower(name) = ?","John Doe".downcase).first VS conn.execut
我有一个150k名称的表,并尝试添加索引降低(名称)以加快查找速度.该索引将原始SQL查询加速大约x100,但使用ActiveRecord执行的相同查询不受影响,如果不是慢一点.

这些是查询:

NamedEntity.where("lower(name) = ?","John Doe".downcase).first

VS

conn.execute(
  %q{SELECT "named_entities".* FROM "named_entities" WHERE (lower(name) = 'john doe');}
)

我添加了索引

CREATE INDEX index_named_entities_on_lower_name ON named_entities USING btree (lower(name));

以下是比较所有案例的基准(每次执行50次):

no index,AR:  6.999421
with index,AR:  7.264234
no index,SQL: 5.569600
with index,SQL: 0.045464

对于AR和SQL,查询计划完全相同.

没有索引:

Seq Scan on named_entities  (cost=0.00..2854.31 rows=785 width=130)
  Filter: (lower((name)::text) = 'john doe'::text)

并有索引:

Bitmap Heap Scan on named_entities  (cost=9.30..982.51 rows=785 width=130)
  Recheck Cond: (lower((name)::text) = 'john doe'::text)
  ->  Bitmap Index Scan on index_named_entities_on_lower_name  (cost=0.00..9.26 rows=785 width=0)
        Index Cond: (lower((name)::text) = 'john doe'::text)

我不知道如何解释这个. ActiveRecord添加的开销不应该受索引的影响,因此AR和SQL的索引和无索引之间的速度差异应该相同,不是吗?

解决方法

我通过添加ANALYZE named_entities找到了解决问题的方法;创建索引后.这使得Postgres更新了各种事物的统计数据,因此它可以生成更好的查询计划. (也发现 Postgres docs是惊人的.)

然而,这仍然没有解释时间差异,因为解释表明SQL和AR查询导致相同的慢查询计划.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读