【问题标题】:Postgres - How to create index for simple association directly (outside of activerecord)?Postgres - 如何直接创建简单关联的索引(在活动记录之外)?
【发布时间】:2014-07-23 01:37:23
【问题描述】:

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

我们已经构建了一个 Sinatra 应用程序来查看数据。我们有很多archive_objects,其中有很多tags

我们通过它们的模型将这两个类关联起来,例如:

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 =&gt; 'archive_object_id_idx'

我想知道,由于我们的数据库不是通过 AR 迁移生成的,如何直接在 psql 中创建此索引?

编辑: 关于我们的“联结表”的信息,是否相关

\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]]

【问题讨论】:

  • 您可以创建迁移以添加索引。例如在迁移中放置def changeadd_index :table, :column_to_be_indexedend

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

来自the PostgreSQL docs,相当于

add_index :tags, :archive_object_id, :name =&gt; 'archive_object_id_idx'

应该是:

CREATE UNIQUE INDEX archive_object_id_idx ON tags (archive_object_id);

我不认为这是您想要的,因为您的 tags 表没有 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);

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多