DB2 / z v10的DB2文档在tablespaces section中包含以下代码段:
作为一般规则,每个表空间中应该只有一个表。
但实际上并没有为此提供任何理由。
我们有一些表格存储了以下几行的历史时间信息(复杂性大大降低,但应足以说明):
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)
(每日表将所有小时记录汇总到一天,每月表与每日数据相同,将其汇总到日期为YYYY-MM-01
的行中。)
现在在我看来,这些表的目的非常相似,我不确定为什么我们希望将它们保存在单独的表空间中。
现在可以将它们合并到一张表中,这是我提出的一个建议,但是有一些并发症阻止它。
是什么“每个表空间一个表”指南背后的基本原理?有什么例外,如果有的话?我假设他们可能是例外,因为它似乎是一个指导而不是一个严格的规则。
答案 0 :(得分:5)
目前,每个表空间维护一个表的主要原因是管理表。大多数DB2实用程序在表空间级别工作。例如,如果对特定表的表空间执行LOAD REPLACE,那么所有其他表将为空,因为LOAD REPLACE的第一件事就是删除所有行。
所以“为什么你不为每个表空间保留一个表?”。我认为,当表与一个没有另一个没用的程度相关时,在一个表空间中包含多个表是合理的,甚至是可取的。例如。 CustomerTable + NextCustomerIDTable。
另一个考虑因素是表空间的类型。根据您创建的表空间类型,在单个表空间中创建多个表可能会影响性能。如果不使用分段表空间,表空间扫描将读取表空间中的所有页面,包括其他表中的页面。请参阅此处的“表空间扫描”主题:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2.doc.ve%2Fdvnhlpcn_tablescan.htm
答案 1 :(得分:4)
它发现他们已经更改了文档中的文本。
问题中提供的link现在包含以下信息:
您应该在表空间中定义的表的数量取决于 关于表的特征:
如果表的大小可能会变大,最好将表放在自己的表空间中。这种设计简化了性能 调整,特别是缓冲池调整。 对于较小的表,多表分段表空间更好。此设计有助于减少所需的数据集数量 管理备份和恢复,以及数据集的数量 数据库系统需要在DB2期间打开和关闭 操作
最好尽量减少表空间的数量 每个数据库的原因如下:
在执行数据定义语句期间,数据库系统对整个数据库保持独占锁,直到提交为止 执行操作。独占锁执行以下操作 功能: 独占锁可防止同一数据库中的表和索引的数据定义语句的并发执行。 如果禁用动态语句高速缓存(子系统参数CACHEDYN = NO),则数据库系统使用数据库锁定 序列化数据定义语句和动态SQL的执行 访问数据库中的表和索引的语句。
如果数据库中的表空间更少,则会同时锁定更少的表空间。 在执行在线REORG实用程序操作的SWITCH阶段期间,数据库系统获得对其的独占锁定 整个数据库序列化在线REORG操作的执行 数据库中表和索引的数据定义语句。
如果数据库中的表较少,则会同时锁定较少的表。 当数据库中的表空间较少时,数据定义语句的日志记录量会更小。
答案 2 :(得分:2)
只是一个疯狂的猜测......但IBM建议每个表空间不要超过一个表,因为许多db / 2实用程序在表空间级别运行。如果将多个表放入一个表空间,则实用程序将作为一个单元对所有表进行操作。
例如,备份和还原在表空间级别工作。您无法在同一表空间中备份/还原单个表。它们都作为一个整体备份或恢复。我相信同样的事情适用于其他实用程序,也可能适用于许多调整参数。
答案 3 :(得分:0)
通常,这是因为“每个表空间一个表”配置的性能选项往往更好。例如,如果表被分区(每个TS需要1 Tb),则可以对某些查询执行受限制的分区扫描。
(但作为大型机表演者,我会说,不是吗?): - )