我们有一个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]]
答案 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);