2014-07-22 1 views
0

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

+0

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' –

Répondre

0

De the PostgreSQL docs, l'équivalent de

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

serait:

CREATE UNIQUE INDEX archive_object_id_idx ON tags (archive_object_id);

Je ne crois pas que ce soit ce que vous voulez dans votre cas, parce que votre table balises n'a pas une colonne de archive_object_id. Vous voulez probablement créer un multicolumn index sur votre "table de jonction".

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

Questions connexes