为什么DB2建议每个表空间一个表?

为什么DB2建议每个表空间一个表?,db2,mainframe,zos,tablespace,Db2,Mainframe,Zos,Tablespace,DB2/z v10的DB2文档在中包含以下代码段: 一般来说,每个表空间中应该只有一个表 但它实际上并没有提供任何理由 我们有一些表存储历史上基于时间的信息,大致如下(复杂性大大降低,但足以说明): (日表将所有小时记录汇总到一天中,月表将对日数据执行相同的操作,将其汇总到日期YYYY-MM-01的行中) 在我看来,这些表在用途上都非常相似,我不确定为什么要将它们保存在单独的表空间中 现在,我建议将它们合并到一个表中,这是一个建议,但有一些复杂因素阻止了它 “每个表空间一个表”准则背后的基本原理

DB2/z v10的DB2文档在中包含以下代码段:

一般来说,每个表空间中应该只有一个表

但它实际上并没有提供任何理由

我们有一些表存储历史上基于时间的信息,大致如下(复杂性大大降低,但足以说明):

(日表将所有小时记录汇总到一天中,月表将对日数据执行相同的操作,将其汇总到日期
YYYY-MM-01
的行中)

在我看来,这些表在用途上都非常相似,我不确定为什么要将它们保存在单独的表空间中

现在,我建议将它们合并到一个表中,这是一个建议,但有一些复杂因素阻止了它


“每个表空间一个表”准则背后的基本原理是什么?有哪些例外情况(如有)?我认为它们可能是例外,因为这似乎是一个指导原则,而不是一个硬性规定。

只是一个猜测。。。但是,IBM可能建议每个表空间不超过一个表,因为许多db/2实用程序都是在表空间级别运行的。如果将多个表放在一个表空间中,则实用程序将所有表作为一个单元进行操作


例如,备份和恢复在表空间级别工作。不能在同一表空间中备份/还原单个表。它们都作为一个单元进行备份或恢复。我相信同样的事情也适用于其他实用程序,可能也适用于许多调优参数。

如今,每个表空间维护一个表的主要原因是管理方面的原因。大多数DB2实用程序在表空间级别工作。例如,如果对特定表的表空间执行加载替换,则所有其他表最终都将为空,因为加载替换所做的第一件事是删除所有行

那么“为什么不在每个桌子空间保留一张桌子?”。我认为在一个表空间中包含多个表是合理的,甚至是可取的,因为一个表与另一个表相关,而另一个表与另一个表无关。例如,CustomerTable+NextCustomerIDTable


另一个考虑因素是表空间的类型。根据您创建的表空间类型,在单个表空间中创建多个表可能会影响性能。如果不使用分段表空间,表空间扫描将读取表空间中的所有页面,包括来自其他表的页面。请参阅此处的“表空间扫描”主题:

通常,这是因为“每个表空间一个表”配置的性能选项往往更好。例如,如果表已分区(每个TS需要1 Tb),则能够对某些查询执行有限分区扫描


(但作为一名大型机性能人员,我会这么说,不是吗?)

他们已经更改了文档中的文本

问题中提供的信息包含以下信息:

应在表空间中定义的表数取决于 关于表格的特点:

如果一个表的大小可能变大,最好将该表放在它自己的表空间中。这种设计简化了性能 调优,特别是缓冲池调优。 对于较小的表,多个表分段表空间更好。这种设计有助于减少需要的数据集数量 要管理的备份和恢复,以及数据集的数量 数据库系统需要在DB2期间打开和关闭 行动

最好尽量减少表中的表空间数量 每个数据库都有以下原因:

在执行数据定义语句期间,数据库系统在提交之前对整个数据库持有独占锁 操作被执行。独占锁执行以下操作 功能: 独占锁防止在同一数据库中并发执行表和索引的数据定义语句。 如果禁用了动态语句缓存(子系统参数CACHEDYN=NO),则数据库系统将使用数据库锁 序列化数据定义语句和动态SQL的执行 访问数据库中的表和索引的语句

如果数据库中的表空间较少,则并发锁定的表空间也较少。 在执行联机REORG实用程序操作的切换阶段期间,数据库系统在 整个数据库以序列化联机REORG操作的执行,以及 数据库中表和索引的数据定义语句

如果数据库中的表较少,则并发锁定的表也较少。 数据库中的表空间越少,数据定义语句的日志记录量就越小


我认为这与页面大小(及其分段)有关,尽管我不能完全确定。但是,此规则与推荐的最大表空间数相结合,将产生非常小的表集。在这种情况下,您可能可以合理地将它们放在一个表空间中—数据集很小,而且相关。我不会将它们合并到一个表中——只需要一个新的程序员对所有记录求和,而不是一种类型。不管怎样,如果您确实有足够的数据来保证,那么这些其他表应该是MQT。@X-Zero,您应该将其作为一个答案,即使是假设也可能是有用的,如果它们导致了答案。MQT是一个很好的建议,这是我们现在在代码中明确做的事情——我不确定在保留期不同的情况下它会如何工作(每小时10天,每天1个月,两年)
Table HOURLY_CPU_USAGE:
    RecDate        date
    RecTime        time
    Node           char(32)
    MaxCpuUsage    float
    primary key    (RecDate, RecTime, Node)
Table DAILY_CPU_USAGE:
    RecDate        date
    Node           char(32)
    MaxCpuUsage    float
    primary key    (RecDate, Node)
Table MONTHLY_CPU_USAGE:
    RecDate        date
    Node           char(32)
    MaxCpuUsage    float
    primary key    (RecDate, Node)