Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

DB2数据库设计和最高性能原则 (3) 分区表

Posted on 2010-04-15 23:27 Prayer 阅读(2153) 评论(0)  编辑 收藏 引用 所属分类: DB2

表空间和表设计考虑事项

 

记录尺寸和页尺寸

 

固定长度的记录比可变长度的记录要好,因为处理固定长度记录的DB2的代码经过了优化。如果记录是固定长度的,那么他就永远不必从原来存储的页中被移动出来。然而,可变长度的记录可能增长到不再适合原来页的长度,因此他也就必须被移动到另一页。无论何时记录被顺序访问,都一定会出现一个额外的参考页。DB2 UDB V8中的一个新特性就是当你不确定未来的数据长度增长情况时,允许你根据需要改动列的尺寸,这样你就能不再需要创建可变长度的记录。

 

每页中记录的数量也是需要考虑的内容。DB2提供了一些有关页尺寸的选项,例如4 KB, 8 KB, 16 KB和32 KB 。比较好的起点是选择默认的4KB,特别是当行的尺寸相对较小,或是对数据的访问比较随机的情况下。然而,在一些情况下,也需要考虑较大的页尺寸。如果表中单个行的长度超过4KB,那么你就需要使用大一些的页尺寸,因为DB2不支持跨行的记录。

 

更有另一种情况是,当固定记录的总长度比二分之一的页(4KB)稍大一些的时候,一页中就只能放置一个记录。另外一种类似的情况是,固定记录的总长度略长于三分之一页、四分之一页,等。这样的设计不仅会浪费DASD空间,还会导致非常多的DB2操作消耗更多的资源。因此,对于上面描述的记录而言,你需要考虑使用较大的页尺寸,这样就会相对地少浪费一些空间。

 

另外一些可能的页尺寸为8 KB, 16 KB和 32 KB。页的尺寸并不在创建表(CREATE TABLE)的语句中直接写明。相反,表中页的尺寸是由分配给包含这个表的表空间的缓冲池中的页尺寸决定的。要获得更周详的信息,你能参考DB2 SQL 手册中有关创建表空间(CREATE TABLESPACE)语句的内容。

 

非标准化考虑事项

 

逻辑数据模型是数据的一个最佳描述。物理数据模型则是数据在现实世界的实现。标准化只集中在数据的内涵上面,而不考虑可能访问数据的应用程式的性能需求。数据库设计的充分标准化会带来性能的挑战。

 

有关此类性能问题的一个非常常见的例子就是连接操作。通常情况下,标准化过程的结果是给各个独立的表赋予相互关联的信息。应用程式需要从这些表中访问数据。关系数据库提供了使用SQL语句来从多于一个的表中通过连接多个表去访问信息的能力。取决于表的数目和他们各自的尺寸,连接操作可能会消耗非常多的资源和时间。

 

因为在I/T中有如此多的事情需要考虑,于是出现了一个折中的想法。对那些包含被频繁访问列的多个表中的数据保存副本,和连接表的性能相比,成本高还是低呢?在逻辑数据库设计过程中,对你的数据模型尽量的执行标准化,之后再对其进行一定程度的非标准化,也许是进行潜在性能优化的一个选项。如果你决定进行非标准化了,要确保从头到尾地记录了文件:对某些细节的描述、执行非标准化步骤之后的推理,等。

 

设计较大的表

 

访问非常大的DB2表需要消耗相当多的资源:CPU,内存,I/O。当设计大表的时候,用户需要做的两件最重要的事情就是:

 

实现分区

 

创建有用的索引

 

以上两个问题将在下面进行周详讨论。

 

使用分段或分区表空间

 

如果数据中包含了LOB,那么用户就必须创建LOB表空间。对于非LOB的数据,通常的选择是分段或分区表空间,具体选择哪一个在非常大程式上取决于你要存储的数据量,同时还需要考虑相关应用程式需求的数据访问类型。不太推荐使用单一的表空间。

 

分段表空间比单一的表空间具有更多的性能优势,如下所示:

 

对于包含多于一个表的表空间,当DB2在一个表上获得锁定时,那个锁定不影响其他表分段的访问。

 

当DB2扫描一个表时,只访问和那个表相联系的分段。此外,空分段的页不会被取出。

 

如果一个表被清除了,不必执行REORG实用工具集,他的分段就即时在COMMIT点上变成可再次使用的状态。

 

如果一个表中的所有行被删除了(被称为块删除),不必执行REORG实用工具集,所有的分段都即时在COMMIT点上变成可再次使用的状态。

 

块删除操作起来更加有效,并且书写相当少的记录信息。

 

COPY(复制)实用工具集不复制由于块删除或表清除所造成的空页。

 

当表达到一个特定的尺寸,他们的可管理性和性能都能通过分区表空间获得改善。如果你想获得这方面的进展,在设计和创建时,以分区的形式定义表空间是个明智的做法。分区表空间的一些潜在优势列举如下:

 

并行性:你能利用三种类型的并行性,他们目前正应用于DB2 UDB。DB2 V3引入了查询并行性(多个I/O路径)。DB2 V4则实现了CP并行性(多CP之上的多任务)。DB2 UDB V5更是引入了系统查询并行机制(多个DB2数据共享群之上的多任务)。DB2的发展进化,显著提高了DB2应用程式处理分区表空间的并行处理能力。由于CPU时间的增加,这些查询所消耗的时间也显著的减少了。

 

在数据的一部分上工作:分区表空间允许DB2应用程式一次运行数据的一个分区,因而使其能够同时运行另外分区上的另外的工作或应用程式。以同样的方式,你能将块UPDATE(更新)、DELETE(删除)或INSERT(插入)操作分解为独立的工作。除增加了可用性之外,这一技术也为完成这类DB2工作减少消耗的时间提供了可能。

 

更快的访问被频繁访问的数据:如果分区索引能够将更多的频繁访问的行从剩余的表中分离出来,然后将那些数据置于一个他自己的,并且应用更高速DASD设备的分区之内。

 

一般而言,表越大,就越应该将其创建为一个分区的表。不过也有一些实际例子表明为小表创建分区表空间是有利的。当查找表用于连接其他大分区表空间时,通过将查找表分区,你能够使并行性在连接中最大化。

 

当你在连接谓词中利用分区方法时,需要考虑一个决定性的因素。被连接在分区方法上的表应该具有相同的分区数,并且应该设定为相同的值。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理