为啥 DB2 建议每个表空间一个表?
Posted
技术标签:
【中文标题】为啥 DB2 建议每个表空间一个表?【英文标题】:Why does DB2 suggest one table per tablespace?为什么 DB2 建议每个表空间一个表? 【发布时间】:2012-02-21 08:30:57 【问题描述】:DB2/z v10 的 DB2 文档在 tablespaces section 中有以下 sn-p:
作为一般规则,每个表空间中应该只有一个表。
但它实际上并没有为此提供任何理由。
我们有一些表格存储基于时间的历史信息,大致如下(复杂性大大降低,但应该足以说明):
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
的行中。
现在在我看来,这些表的用途都非常相似,我不确定为什么我们要将它们保存在单独的表空间中。
暂时不考虑将它们组合到一个表中的可能性,这是我提出的建议,但有一些复杂因素阻碍了它。
是“每个表空间一个表”准则背后的基本原理是什么?有哪些例外(如果有)?我假设它们可能是例外,因为这似乎是一个指导方针,而不是一个硬性规定。
【问题讨论】:
我认为这与PAGESIZE
(及其分段)有关,尽管我不完全确定。但是,此规则与建议的最大表空间数相结合,将产生非常小的表集。在这种情况下,您可能可以合理地将它们放入一个表空间 - 数据集很小且相关。我不会将它们合并到一个表中 - 只需要一位新程序员来汇总所有记录,而不是一种类型。无论如何,如果您实际上有足够的数据来保证它,那么这些其他表应该可能是 MQT。
@X-Zero,你应该把它作为一个答案,即使假设可以得出答案,也是有用的。 MQT 是一个很好的建议,这是我们现在在我们的代码中明确地做的事情 - 我不确定在保留期不同的情况下它会如何工作(每小时 10 天,每天 1 个月,2 年每月),但这绝对是我会研究的。
【参考方案1】:
如今,每个表空间维护一个表的主要原因是管理上的。大多数 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
【讨论】:
【参考方案2】:看起来他们已经更改了文档上的文字。
问题中提供的link 现在包含以下信息:
您应该在表空间中定义的表数量取决于 关于表的特点:
如果表可能变大,最好将表放在自己的表空间中。这种设计简化了性能 调优,特别是缓冲池调优。 对于较小的表,多表分段表空间更好。这种设计有助于减少需要的数据集数量 要管理的备份和恢复,以及数据集的数量 数据库系统在 DB2 期间需要打开和关闭 操作。
最好尽量减少表空间的数量 每个数据库的原因如下:
在执行数据定义语句期间,数据库系统对整个数据库持有排他锁,直到提交 执行操作。排他锁执行以下操作 职能: 排他锁防止并发执行同一数据库中的表和索引的数据定义语句。 如果动态语句缓存被禁用(子系统参数 CACHEDYN=NO),数据库系统使用数据库锁来 序列化执行数据定义语句和动态SQL 访问数据库中的表和索引的语句。
如果数据库中的表空间较少,则同时锁定的表空间也较少。 在执行联机 REORG 实用程序操作的 SWITCH 阶段期间,数据库系统在 整个数据库以序列化在线 REORG 操作的执行和 数据库中表和索引的数据定义语句。
如果数据库中的表较少,则同时锁定的表也较少。 数据库中的表空间越少,数据定义语句的日志记录量就越小。
【讨论】:
【参考方案3】:只是一个疯狂的猜测......但也许 IBM 建议每个表空间不超过一个表,因为许多 db/2 实用程序在表空间级别运行。如果将多个表放入一个表空间,那么实用程序会将所有表作为一个单元进行操作。
例如,备份和恢复工作在表空间级别。您不能备份/恢复同一表空间中的单个表。它们都作为一个单元进行备份或恢复。我相信同样的事情适用于其他实用程序,并且可能也适用于许多调整参数。
【讨论】:
【参考方案4】:通常这是因为“每个表空间一个表”配置的性能选项往往更好。例如,如果表已分区(每个 TS 需要 1 Tb),则可以对某些查询执行有限分区扫描。
(但作为大型机性能人员,我会这么说,不是吗?):-)
【讨论】:
以上是关于为啥 DB2 建议每个表空间一个表?的主要内容,如果未能解决你的问题,请参考以下文章