DB2开发与性能优化

范式化原则

物理表:优先考虑降低数据冗余度、消除二义性,在合理代价的前提下,以第三范式为目标进行表设计。兼顾访问性能、可扩展性等因素,可以在适当范围内进行必要的降范式处理,但必须有配套机制保证数据一致性。
临时表:优先考虑程序访问性能和便捷性,通常不受范式化制约。

表空间使用和分配原则

用户数据与系统数据分离
永久数据与临时数据分离
表数据与索引数据分离
大对象数据独立

字段非空约束

物理表:尽量对所有字段使用非空约束,并设置字段默认值。特殊情况下,允许部分字段不使用非空约束,但必须保证这些字段不作为过滤条件、分组条件,且不参与表达式运算。
临时表:所有字段必须使用非空约束,非逻辑主键字段尽量设置字段默认值。

字段排序

通用原则:表中字段排序依次为:A类技术字段、业务主键字段、B类技术字段、业务非主键字段、C类技术字段。
业务主键字段排序原则:业务主键字段多个时,按访问频度和字段取值区分度由高到低排列。
业务非主键字段排序原则:根据业务含义分组,业务含义相近的字段排在一起;组间和组内再按访问频度由高到低排列,或按业务要素生成次序排列。
A类技术字段:决定整表数据分布的关键字段。状态快照表的快照日期、流水表的数据日期。
B类技术字段:决定单行记录数据状态的关键字段。状态拉链表的拉链起始日期。
C类技术字段:存放单行记录描述信息的字段。记录生成日期、维护日期、维护用户。

逻辑主键

所有表在设计阶段必须确定逻辑主键。逻辑主键是应用可以正确识别表中记录的必要条件。逻辑主键字段数量较多时,可采用代理键字段充当逻辑主键。以代理键作为逻辑主键时,原始逻辑主键仍需记录在设计文档中。

物理主键

推荐对所有表均建立物理主键。物理主键通常与逻辑主键保持一致。存在多组逻辑主键时,建议将字段访问频度最高的一组作为物理主键,其它组建立唯一索引或唯一约束。特殊情况下,允许表中不建物理主键。对常用于大批量批处理的表,为兼顾处理性能,可以不建物理主键。必须有相应的机制保证表中的数据对该表的逻辑主键而言具有唯一性。

外键

在设计阶段可以识别的外键关系必须在设计文档中体现。外键关系可作为数据完整性、一致性判断的依据。外键关系通常不需要物理化。将外键关系物理化会给后续的批量数据处理和数据管理带来一定程度的不便。可通过应用程序或数据质量校验程序保证外键关系。在某些对数据完整性要求极高的联机应用系统中,关键的外键关系可以物理化。

其它约束

业务性约束必须在设计文档中体现,但通常无需物理化。业务性约束可作为数据完整性、一致性判断的依据。业务性约束通常由应用程序保证,可能随业务需求发生变化。技术性约束通常必须物理化。

分区键设置原则

多分区数据库中的所有表均必须显式指定分区键。单分区数据库中的表推荐在设计阶段指定备选分区键。物理表优先选择逻辑主键中区分度最高的单一字段。临时表优先选择后续关联条件或分组条件中包含的区分度最高的单一字段。

索引创建原则

索引应按需创建,同一张表上的索引数量不宜过多。除物理主键所含唯一索引外,同一张表上的索引数量不宜超过三个。索引字段选择及排序原则:当索引由多个字段组成时,除完全匹配外,使用其第一个字段开始的子集对访问效率也有提升作用。最优先考虑使用频度:使用频度较高的字段优先选择且排序靠前。次优先考虑字段区分度:区分度较高的字段排序靠前,区分度过低的字段不建议包含在索引中。同一个索引中包含的字段总数不宜超过四个。

临时表声明

必须集中在程序逻辑开始之前进行。必须符合数据对象设计规范。
必须显式包含的选项:
not logged
with replace;
按需决定是否包含的选项:
on commit preserve rows
尽量避免使用like方式声明临时表,仅特殊用途除外。

临时表使用

临时表声明后需显式提交事务。临时表上如需创建索引,必须在数据写操作完成后创建。如果临时表中存放的数据量较大,且根据程序逻辑已能确认后续程序段中不再使用该数据的,必须显式将其中的数据清空。如果临时表中存放的数据量较大,推荐在数据写操作完成后显式对其统计信息进行收集。

锁资源控制原则

程序中读取物理表通常需要显式指定最低隔离级别(with ur)。单个程序仅对一张物理表或视图进行写操作。多个程序对同一张物理表或视图进行写操作时,必须严格保证这些程序串行或互斥运行。查询类程序禁止对物理表进行写操作。数据处理程序中禁止显式对物理表收集统计信息。

日志控制原则

一次性删除目标表全部数据时,需使用truncate语句。
程序中对物理表进行写操作数据量过大时,需采用替代方式处理。
insert:分段提交;
delete:保存剩余数据、清空目标表、插入已保存数据;
update:保存更新数据、保存不变数据、清空目标表、插入以保存数据。
日志使用量较大的程序,需严格保证串行或互斥运行。

大表关联限制

所有参与关联的大表必须具备完全相同的分区键,即分区键字段数量、顺序、数据类型(大类)完全匹配。关联条件必须包含分区键的所有字段对应相等,分区键字段上禁止使用函数或表达式,且只能以and逻辑运算连接。
关联条件中需附加分区键字段以外的其它条件时,也只能以and逻辑运算连接。
大表关联之前需保证已收集统计信息。

数据库连接控制原则

在线应用系统应通过应用程序或中间件连接数据库。
在线应用系统应具备数据库连接中断重连机制。
在线应用系统使用数据库长连接时,每天必须至少刷新一次连接。

造成批量数据处理程序性能问题的常见原因

分区键设置、索引设置、表关联方式、预处理充分程度
分区键设置与使用:大表未设分区键、分区键字段选择不合理、分区键字段数据类型或长度设置不合理、大表关联时关联条件中未同时包含双方分区键字段、大表分组统计时分组条件中未包含分区键字段、访问大表前未收集统计信息
索引设置与使用:大表未根据访问需要建立索引、同一张表上的索引数量过多、索引字段选择或字段顺序排列不合理、频繁更新的大表上索引未定期重建、程序中动态建立索引的时机不合理、访问含有索引的大表前未收集统计信息
表关联方式:在SQL语句中使用Common Table、在SQL语句中不合理使用子查询、在子查询中出现表关联或分组统计
预处理充分程度:表关联时在关联条件中使用函数或表达式、分组统计时在分组条件中使用函数或表达式、在含有复杂关联或分组统计的语句中同时出现复杂的逻辑运算、在同一程序中多次出现相同的复杂逻辑运算、一次性处理长周期范围内超大数据量的数据
其它代码规范性问题:表关联时将关联条件与过滤条件混杂、访问流水类大表时未指定时间段、程序中的临时表定义和使用不合理、程序中对事务日志占用未进行有效控制、程序中或多个程序之间未考虑锁机制可能造成的影响、对程序的输入参数未进行有效性检查、程序中调用其它程序时对子程序的返回值未进行有效性检查

你可能感兴趣的:(DB2开发与性能优化)