如何为数据和索引指定单独的表空间?

时间:2014-01-17 15:59:05

标签: java oracle hibernate tablespace

我有两个表空间:一个用于数据,一个用于索引。我无法更改此配置。如何在Hibernate中指定索引表空间?

我读过Hibernate Oracle Tablespace Annotation,但这不是同一个问题。我需要为数据指定表空间,为索引指定不同的表空间。

2 个答案:

答案 0 :(得分:2)

我理解你的挑战。我不相信Hibernate有任何简单的方法可以做到这一点。以下是一些解决方法:

  1. 让Hibernate继续并在"错误"中创建索引。表空间,然后运行数据库语句,将索引重建(移动)到正确的表空间,即:ALTER INDEX some_index_name REBUILD TABLESPACE your_index_ts;
  2. 如果您有很多索引,这个元脚本可能会帮助您查找和移动错位的索引。输出将是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可能很有用。