5

I have two tablespaces: one for data and one for index. I can't change this configuration. How can I specify in Hibernate the index tablespace?

I've read Hibernate Oracle Tablespace Annotation, but it's not the same problem. I need to specify the tablespace for data and a different tablespace for indexes.

4

2 回答 2

2

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

  1. 让 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”属性;唉,没有这样的功能。

于 2014-06-16T18:03:00.007 回答
0

在这种情况下,休眠属性hibernate.default_schema可能很有用。

于 2019-03-26T09:26:31.453 回答