Oracle模式设计:分离模式是否会增加I/O开销?

4
我们正在为基于Oracle 11gR1的新系统设计数据库模式。我们已经确定了一个主要的模式,其中将有近100个表格,这些表格将从前端Java应用程序中访问。
我们需要审核接近50个表格中发生更改的值,这必须每行都完成。
这意味着,在MYSYS.T1中的一行可能会在MYSYS_AUDIT.T1_AUD表中有50个(或更多,甚至更少,但最少1个)行。我们可能会拥有每个列条目的旧值和来自T1的新值。
DBA提出了一个建议,反对这种方法,因为他说,单独的模式意味着每个操作都需要额外的I/O。基本上,AUDIT模式只用于进行一些分析和输入值(因此是SELECTINSERT)。
“单独的模式意味着额外的I/O”是真的吗?我找不到理由。
对我来说,这似乎是合乎逻辑的,因为审核数据不应被篡改,所以需要一个单独的模式。
此外,我们为存档一些来自MYSYS的表格设计了一个单独的模式。从MYSYS_ARC中的表格可能会备份到磁带上或在足够的时间后被删除。
一些统计数据:
MYSYS模式中的一些表格(接近20,30个)可能增长到约50M行。
我们要求总共4TB的磁盘空间。
MYSYS_AUDIT模式可能有MYSYS的10倍,但我们不会保留它们超过3个月。
MYSYS中只有少数表格将进行以下每分钟事务。
- 100个INSERTMYSYS中,意味着同样数量的插入到MYSYS_AUDIT表格中。 - 1000个UPDATEMYSYS表格中,意味着同样数量的插入到MYSYS_ADIT表格中。
问题:
鉴于这一切,您能否给我提出任何改进建议?
1.单独的模式会影响磁盘I/O吗?(每个模式都需要额外的I/O吗?) 2.有任何一般性建议吗?
图:
+-------------------+          +-------------------+
|       MYSYS       |          |     MYSYS_AUDIT   |
|                   |          |                   |
|    1. T1          |          |     1. T1_AUD     |
|    2. T2          |          |     2. T2_AUD     |
|    3. T3          |--------->|     3. T3_AUD     |
|    4. T4          |(SELECT,  |     4. T4_AUD     |
|     .             | INSERT)  |      .            |
|     .             |          |      .            |
|     .             |          |      .            |
|  100. T100        |          |    50. T50_AUD    |
+-------------------+          +-------------------+
        |
        |
        |
        |
        |(INSERT)
        |
        |
        |
        *
+-------------------+
|   MYSYS_ARC       |
|                   |
|    1. T1_ARC      |
|    2. T2_ARC      |
|    3. T3_ARC      |
|    4. T4_ARC      |
|     .             |
|     .             |
|     .             |
|  100. T100_ARC    |
+-------------------+

除此之外,我们还有两个仅具有只读权限的模式,但主要是为了临时目的,我们并不在意它们的性能。
建议如下:
有几点建议。我们同意以下内容:
  1. 逻辑分离的架构。
  2. TRIGGER用于将数据插入到审计表中。
  3. 表名不会有_AUD后缀。 :)
  4. 用于填充ARCHIVE 模式表的过程。
  5. 基于时间间隔进行分区。
我们正在分析...
  1. 工作空间管理器选项。
在接受APC或dpbradely的解决方案之前,问题仍然存在进一步的建议。

2
“分离的模式意味着额外的I/O”……要么你听错了,要么那个数据库管理员需要找另一份职业,委婉地说。 - Jeffrey Kemp
笑。。@杰弗里,我非常确定他说过那句话。现在不想麻烦他太多。 :) - Guru
5个回答

3

将对象放在单独的模式中不会导致额外的I/O - 可能有误解,你的DBA想表达的是审计的存在会导致额外的I/O,这当然是无论如何实现都是正确的。


+1。谢谢。是的。始终需要额外的I/O进行审计。还有其他一般建议吗? - Guru

3
拥有单独的模式确实是正确的选择。除此之外,这意味着您可以使用相同的表名-MYSYS.T1MYSYS_AUDIT.T1-如果您有表名较长(>25个字符),这将非常有帮助。
但是,单独模式的主要优点在于可以将审计表屏蔽,以防止意外或恶意篡改。
插入审计行的影响,例如来自触发器,不受所有者的影响。
一般的表设计建议:
最好为审计表提供与主表相同的结构。因此,如果需要进行审计的元数据列(例如修订号)在主表上包含它们。此外,请使用新值而不是旧值填充审计表。也就是说,在将新记录插入MYSYS.T1时,将匹配记录插入MYSYS_AUDIT.T1;当将现有记录更新为MYSYS.T1时,在MYSYS_AUDIT.T1中插入新记录。如果审计表的最新记录与主表中的当前记录相同,则更容易验证和报告审计表。
触发器的使用:
审计并不需要很复杂。我们只需要在before insert or update or delete trigger中插入一个语句。这些可以轻松从数据字典视图USER_TAB_COLUMNS生成。

你提供了我忘记的信息。我们将使用一个TRIGGER来插入到MYSYS_AUDIT表中。我们考虑过以程序方式完成,但这只是一个触发器。还有其他建议吗? - Guru

1

看一下范围分区,用于审计数据。您可能想将审计数据发送到更便宜的存储器。分区使得轻松地将例如一个月的数据发送到另一个服务器,或者删除早于一个月的审计记录。

http://www.orafaq.com/wiki/Interval_partitioning


+1。感谢您对范围分区的建议。我们已经计划了这个,只是忘记在这里提到了。我喜欢《奇爱博士》。 :) - Guru

1
除了APC的回答之外。
可以看一下工作空间管理器,可能比触发器更好,因为它们可能会失败或被禁用等。

+1。感谢您对工作区管理器的建议。需要对此进行一些分析。 - Guru

1

另外,如果你有钱,可以看看 Oracle 的 Total Recall


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接