Nous avons une base de données Postgres qui est remplie à travers une application de noeud qui analyse XML et charge notre ensemble de données pour nous.Postgres - Comment créer un index pour une association simple directement (en dehors de activeecord)?
Nous avons construit une application Sinatra pour voir les données. Nous avons un certain nombre de archive_objects
qui ont un certain nombre de tags
.
Nous avons associé les deux classes par leurs modèles, par exemple:
class ArchiveObject < ActiveRecord::Base
has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :archive_objects
end
Nous avons remarqué que l'appel, par exemple current_archive_object.tags
est assez lent (400 + ms en moyenne), et après avoir lu Using indexes in rails: Index your associations, je vois la recommandation de créer l'indice de cette association simple dans la migration ActiveRecord (noms modifiés pour la pertinence ici):
add_index :tags, :archive_object_id, :name => 'archive_object_id_idx'
Je suis Je me demande, comment puis-je créer cet index directement dans psql
depuis notre base de données n'est pas généré par une migration AR?
EDIT: Informations sur notre 'table de jonction', devrait-il être utile
\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
Et l'appel SQL à partir de la console rack:
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]]
vous pouvez créer une migration pour ajouter l'index. par exemple en migration mettre 'def change' ' add_index: table,: column_to_be_indexed' 'end' –