Postgres - 如何直接创建简单关联的索引(在activerecord之外)?

时间:2014-07-22 15:51:15

标签: ruby-on-rails ruby postgresql activerecord

我们有一个Postgres数据库,该数据库通过一个节点应用程序填充,该应用程序解析XML并为我们加载数据集。

我们已经构建了一个Sinatra应用程序来查看数据。我们有一些archive_objects,其中有tags个。{/ p>

我们通过他们的模型关联了这两个类,例如:

class ArchiveObject < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :archive_objects
end

我们注意到调用,例如current_archive_object.tags非常慢(平均400 + ms),在阅读Using indexes in rails: Index your associations后,我看到建议为此简单关联创建索引ActiveRecord迁移(此处为相关性而修改的名称):

add_index :tags, :archive_object_id, :name => 'archive_object_id_idx'

我想知道,我怎么能直接在psql创建这个索引,因为我们的数据库不是通过AR迁移生成的?

修改: 关于我们的“联合表”的信息,如果相关的话

\d+ archive_objects_tags
                               Table "public.archive_objects_tags"
      Column       |           Type           | Modifiers | Storage | Stats target | Description
-------------------+--------------------------+-----------+---------+--------------+-------------
 created_at        | timestamp with time zone | not null  | plain   |              |
 updated_at        | timestamp with time zone | not null  | plain   |              |
 tag_id            | integer                  | not null  | plain   |              |
 archive_object_id | integer                  | not null  | plain   |              |
Indexes:
    "archive_objects_tags_pkey" PRIMARY KEY, btree (tag_id, archive_object_id)
Has OIDs: no

来自机架控制台的SQL调用:

Tag Load (397.4ms) SELECT "tags".* FROM "tags" INNER JOIN "archive_objects_tags" ON "tags"."id" = "archive_objects_tags"."tag_id" WHERE "archive_objects_tags"."archive_object_id" = $1 [["archive_object_id", 4823]]

1 个答案:

答案 0 :(得分:0)

来自the PostgreSQL docs,相当于

add_index :tags, :archive_object_id, :name => 'archive_object_id_idx'

将是:

CREATE UNIQUE INDEX archive_object_id_idx ON tags (archive_object_id);

我不相信这是你想要的,因为你的标签表没有archive_object_id列。您可能想在“联结表”上创建multicolumn index

CREATE UNIQUE INDEX archive_objects_tags_tag_id_archive_object_id_idx ON archive_objects_tags (archive_object_id, tag_id);