J'utilise Hibernate 3.3.2 dans un projet assez important avec PostgreSQL 8.4 à l'aide du postgreSQLLDialect. P>
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. p>
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. P>
MySQL ajouterait automatiquement des index à ces colonnes, mais il ne semble pas y avoir un moyen de le faire à Postgres. P>
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? p>
4 Réponses :
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. P>
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! p>
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. P>
Il est de bon sens de ne pas Force i> les clés étrangères d'avoir un index, mais cela semble être une bonne option pour permettre.
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>
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
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';
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).
En plus de la réponse de Matthew:
Ajout 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. P> p>