我理解你的挑战。我不相信 Hibernate 有任何简单的方法可以做到这一点。以下是一些解决方法:
- 让 Hibernate 继续在“错误”的表空间中创建索引,然后在您的数据库语句上运行以重建(移动)索引到正确的表空间,即:
ALTER INDEX some_index_name REBUILD TABLESPACE your_index_ts;
.
如果您有很多索引,此元脚本可能会帮助您查找和移动放错位置的索引。输出将是ALTER
上面的语句。
SELECT 'ALTER INDEX '||owner||'.'||index_name||' REBUILD TABLESPACE your_index_ts;' stmt
FROM all_indexes
WHERE table_owner='YOUR_SCHEMA'
AND tablespace_name != 'YOUR_INDEX_TS';
从理论上讲,您可以将其自动化并将其放入存储过程中。
让我提出 Tom Kyte 可能会提出的问题:为什么要将索引放在单独的表空间中?您要解决什么应用程序或性能问题?
观点(在评论中随意不同意):
坚持将索引存储在单独的表空间中是老派。事实上,在某些情况下,这种做法可能会带来好处,但我最近还没有看到这种情况。原因是,如果你在做海量 DML,如果数据和索引在同一个磁盘上,你会在数据和索引之间发生 IO 争用,因此 DBA 通过不同的表空间强制它们在不同的设备上。但是,如果 DBA 将数据表空间和索引表空间放在同一个磁盘上,那么它就否定了这个意图。如今,您的数据文件往往分布在许多轴上(通过 ASM,甚至通过 RAID 集分布在非 ASM 上,但在 SAN 上运行时更是如此)。借助 ASSM 表空间(不要与 ASM 或 ASMM 混淆),如今的 Oracle 可以很好地处理与表段相同的表空间中的索引段。如果你必须做 TSPITR,将整个架构放在一个表空间中会使事情变得容易一些。我可能会将 LOB 放在单独的表空间中,但这不是您要的。
如果您的 DBA 说索引需要在单独的表空间中“只是因为它们这样做”,那么您需要一个新的 DBA。
您可能希望 Oracle 12c 发布时每个用户都有一个“DEFAULT INDEX TABLESPACE”属性;唉,没有这样的功能。