我有两个表空间:一个用于数据,一个用于索引。我无法更改此配置。如何在Hibernate中指定索引表空间?
我读过Hibernate Oracle Tablespace Annotation,但这不是同一个问题。我需要为数据指定表空间,为索引指定不同的表空间。
答案 0 :(得分:2)
我理解你的挑战。我不相信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说索引需要在一个单独的表空间中,而且只是因为他们做了#34;那么你需要一个新的DBA。
您可能希望Oracle 12c将通过" DEFAULT INDEX TABLESPACE"每个用户的财产;唉没有这样的功能。
答案 1 :(得分:0)
休眠属性hibernate.default_schema
可能很有用。