hibernate - 让 Hibernate 生成外键索引

标签 hibernate postgresql indexing foreign-keys

我在使用 PostgreSQLDialect 的 PostgreSQL 8.4 的相当大的项目中使用 Hibernate 3.3.2。

我们建立关系的方式最终会在表的外键属性上进行大量搜索。

出于性能原因,我希望在我们使用 hbm2dll.auto 创建表时让 Hibernate 将索引添加到所有外键列。

MySQL 会自动为这些列添加索引,但在 Postgres 中似乎没有办法做到这一点。

有没有我可以在某处设置的选项,或者我可以添加到我的 hbm.xml 文件中以实现此目的的选项?

最佳答案

这是一个快速查询,它会为模式中每个定义的外键的索引生成 DDL:

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

这只在 PostgreSQL 8.4 中测试过,但我认为它应该适用于大多数 8.x 版本。

另请注意,这不会检测哪些已被索引覆盖,因此您可能会有一些重复。

关于hibernate - 让 Hibernate 生成外键索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970193/

相关文章:

python - 如何构建 pandas 数据框中项目的频率计数表?

java - Hibernate,从映射文件生成实体和数据库

java - 使用无状态 session 保存 ManyToMany 集合

java - Hibernate 连接无法在 Apache Tomcat 启动时运行

ruby - rake 数据库 :migrate runs into an error for an undefined method

sql - 如何使用seek pagination获取下一个数据集?

java - Hibernate LazyInitializationException - 如何解决此问题?

php - 无法使用 AES-256-CBC 中的 pgcrypto 解密,但 AES-128-CBC 可以

postgresql - 在 postgres 热备服务器上创建只读用户

postgresql - 当名称可以是任何语言时,如何按名称索引 postgres 表?