9
votes

Obtenir de l'hibernation pour générer des index sur les clés étrangères

J'utilise Hibernate 3.3.2 dans un projet assez important avec PostgreSQL 8.4 à l'aide du postgreSQLLDialect.

La façon dont nous avons nos relations configurées, nous finissons à faire beaucoup de recherche sur les attributs de clé étrangère de nos tables.

Pour des raisons de performances, j'aimerais avoir des hibernes ajouter des index à la toutes les colonnes de clé étrangère lorsque nous créons nos tables à l'aide de HBM2DLL.Auto.

MySQL ajouterait automatiquement des index à ces colonnes, mais il ne semble pas y avoir un moyen de le faire à Postgres.

Y a-t-il une option que je peux définir quelque part ou quelque chose que je peux ajouter à mes fichiers hbm.xml pour que cela se produise?


0 commentaires

4 Réponses :


2
votes

Hibernate n'applique que IndexCréation pour MySQL, non pour PostgreSQL, Oracle, etc. MySQL ne permet pas aux clés étrangères sans index, d'autres bases de données ne disposent pas de cette restriction.

sybase a un Explication Pourquoi c'est Une bonne chose à ne pas imposer d'index, le Hibernate Forum a également un sujet sur il (Oracle lié), y compris une solution de contournement. Mais avant de commencer à créer beaucoup d'index, commencez à vérifier si vous avez besoin de tous ces index. Dans de nombreux cas, les index peuvent être combinés avec d'autres pour accélérer les choses. Tout dépend!

Utilisez Expliquer sur vos questions pour voir comment la base de données les exécute, quels index sont utilisés, où des index manquent, etc.


1 commentaires

Il est de bon sens de ne pas Force les clés étrangères d'avoir un index, mais cela semble être une bonne option pour permettre.



1
votes

Essayez l'un de:

<many-to-one name="master" class="Master" column="master_id" index="my_index_name" />

<many-to-one name="master" class="Master">
    <column name="master_id" index="my_index_name" />
</many-to-one>


2 commentaires

J'ai essayé les deux, mais cherchez la base de données des index qui aurait dû être créé aucun résultat = \ Je ne sais pas ce que je ferais peut-être mal, mais continuera à brancher.


De quel réglage utilisez-vous avec? Peut-être qu'ils ne sont pas ajoutés avec "mise à jour", mais seraient avec "Créer" ou "Créer-goutte"? Une autre idée, peut-il être un bug comme celui-ci: opensource.atlassian.com/ Projets / Hibernate / Parcourir / HHH-1012



3
votes

Voici une requête rapide et sale qui générerait le DDL pour les index sur chaque clé étrangère définie dans un schéma:

SELECT 'CREATE INDEX fk_' || conname || '_idx ON ' 
       || relname || ' ' || 
       regexp_replace(
           regexp_replace(pg_get_constraintdef(pg_constraint.oid, true), 
           ' REFERENCES.*$','',''), 'FOREIGN KEY ','','') || ';'
FROM pg_constraint 
JOIN pg_class 
    ON (conrelid = pg_class.oid)
JOIN pg_namespace
    ON (relnamespace = pg_namespace.oid)
WHERE contype = 'f'
  AND nspname = 'public';


4 commentaires

Une fois la base de données configurée, cela est utile, mais pour cette question, j'étais vraiment plus intéressé à faire de l'hibernation pour le faire pour moi, quand cela crée les tables. C'est une excellente réponse pour mon autre question associée: Stackoverflow.com/Questtions/2970050/...


Je pense que cela ne fonctionne pas sur cité nommé variables.


@RAVSHAN: Ignorer pour le moment que l'on ne faut pas utiliser de noms cités dans les définitions de la table de base de données, cela semble fonctionner pour moi en 9.3: Sélectionnez Regexp_replace distincte (Regexp_replace (pg_get_constracedef (OID), '^. * Les références ",". Sur '),'). * $ '', ');') De pg_constraint datant où Contype = 'F'.


Parfois, il est inévitable en utilisant des identifiants cités (au moins à des fins héritées).



1
votes

En plus de la réponse de Matthew: Ajout xxx

juste avant que le point-virgule ne crée que des index si elles n'existent pas. Cela vous permet d'exécuter à plusieurs reprises la déclaration sans produire "relation FK _..." existe déjà "des erreurs.


0 commentaires