摘要: 设计模式六大原则(1):单一职责原则定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案:遵循单一职责原则。分别建立两个类... 阅读全文
posted @ 2015-11-03 12:08 小土_ 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 为了获取数据,DB2使用了一种两阶段架构。数据管理器(Data Manager)称为第一阶段,即Stage 1,照惯例这个阶段会应用简单的SQL谓词,另外可以使用索引来获取数据。有时,Stage 1谓词也称为“可求值”(sargable)谓词,这是IBM的说法,表示可搜索参数(searchable argument)。如果数据管理器无法处理这个谓词,会把它传递到DB2的关系型数据服务(relational data service,RDS)部分,作为一个Stage 2(剩余)谓词。Stage 1谓词的性能要优于Stage 2谓词,因为不同阶段间的数据传递在列值级进行。如果行在第1阶段已经限定, 阅读全文
posted @ 2013-07-15 09:17 小土_ 阅读(369) 评论(0) 推荐(0) 编辑
摘要: 如果所处理的数据会一直保留在应用的逻辑工作单元中,可以考虑使用全局临时表(global temporary table,GTT),而不要反复建立或物化数据。如果在程序执行期间多次获取或物化同样的数据,可以把这些数据在一个GTT中加载一次,然后在代码的其他地方引用这个表。例如,一个程序有多个游标,每个游标包含多个表联接。另外,每个游标都包含同样的表Table1,而这恰好是各个查询的驱动表。处理各个游标时,可能必须从数据库获取相同的行来完成Table1处理。这样一来,就会导致对相同数据额外的I/O处理。所以,更好的做法是先获取Table1数据,把它插入到一个GTT中,然后在各个游标中引用这个GTT 阅读全文
posted @ 2013-07-12 09:24 小土_ 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 假设一个查询性能不佳,它的主要筛选谓词之一是一个区间谓词,如下所示:WHEREHIREDATE>:HV-DATE如果数据库管理器没有使用HIREDATE列上的索引,你可能希望尽量让它使用这个索引,那么可以如下编写代码:WHEREHIREDATEBETWEEN:HV-DATEand:HV-DATE2只是要确保将第二个变量设置为某个极值,并将其包含在一个宿主变量字段中(这里设置为 ‘9999-12-31’)。注意,只有在使用宿主变量(静态SQL中)或参数标记(动态SQL)时这种方法才奏效。优化工具很聪明,它知道实际上硬编码的 ‘9999-12-31’不会改变逻辑。不过,如果它看到一个变量,在 阅读全文
posted @ 2013-07-12 09:20 小土_ 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 性能调优中通常都要尽量减少对DB2的SQL请求,特别是批量程序,因为与其他程序相比,批量程序会处理更多的数据。每次向数据库管理器发送一个SQL调用都会带来开销,包括向DB2发送SQL语句的开销,以及从操作系统的一个地址空间到另一个地址空间以便DB2执行的开销。所以,一般来讲开发人员需要尽量减少:打开/关闭时间游标的次数。随机的SQL请求数(在DB2监视器中称为同步读)。很多开发人员会采用过程方式考虑和编写代码。利用RDBMS开发应用并编写SQL时,开发人员需要更多地从关系角度来考虑。也就是说,他们需要考虑“怎样才能向数据库管理器发送最少的SQL语句来得到所需的全部数据,而不是做这么多的过程调用 阅读全文
posted @ 2013-07-12 09:19 小土_ 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 大多数开发人员会在需要时写UNION,这往往会导致执行一个排序来消除重复。不过,不同的查询之间通常并不存在重复,所以SQL语句应该写为UNION ALL,从而去除这种“做无用功”的排序。例如:SELECTDEPTNO FROMDEPT WHEREMGRNOin('000010','000020','000030') UNION SELECTDEPTNO FROMPROJ WHEREPROJNO='PA1000'如果有UNION语句,DB2最后会自动地执行一个排序来消除所有DEPTNO重复。不过,有很多这样的查询,在不同的查询之间可 阅读全文
posted @ 2013-07-12 09:17 小土_ 阅读(924) 评论(0) 推荐(0) 编辑
摘要: 要使用硬编码而不是使用宿主变量,如果程序员在SQL语句中使用了宿主变量字段,这一点就尤其重要。大多数COBOL程序都写为静态SQL程序而不是动态SQL程序。对于这些COBOL程序,执行DB2 Bind时,直至运行时之前优化工具都无法知道宿主变量中的具体值。所以,优化工具为SQL语句选择访问路径时,它会有一些默认的判定规则。例如,假设一个表包含100万行。在这个表中,列Status_Cd上有一个索引。对这个表执行典型的Runstats时,优化工具会知道状态码(Status_Cd)有3个不同的值。运行一次特殊的Runstats之后,会为这个列指定频率值统计信息,DB2就会了解到以下数据分布:状态码 阅读全文
posted @ 2013-07-12 09:17 小土_ 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 可以在各个指定表和关联索引上执行Runstats工具,这样就能确保所处理的表的数据分布和其他统计信息正确并且反映当前的最新状况。这个工具会在系统编目表中加载某个表和/或关联索引特性的有关信息。另外它还会提供数据分布信息,优化工具在选择访问路径时会查找这些信息。下面是Runstats工具提供的部分信息:表大小(行数)索引列的基数某些列按值统计的行频率信息表文件的物理特性分区表按分区统计的信息如果没有加载表统计信息,或者表统计信息已经过时,优化工具可能会选择并不特别适用于这些表的访问路径。这可能会影响性能。例如,如果一个表包含500万行,但Runstats是在表包含20万行时运行的,那么DB2仍然 阅读全文
posted @ 2013-07-12 09:16 小土_ 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 尽可能分离谓词。下面的例子可以说明这一点:SELECTDEPTNO,DEPTNAME FROMDEPT WHERE(ADMRDEPT='E01'ANDDEPTNAMELIKE'BRANCH%') OR(DEPTNO='D01'ANDDEPTNAMELIKE'BRANCH%')也可以写作:SELECTDEPTNO,DEPTNAME FROMDEPT WHERE(ADMRDEPT='E01'OR DEPTNO='D01') ANDDEPTNAMELIKE'BRANCH%'这里的关键是:可 阅读全文
posted @ 2013-07-12 09:15 小土_ 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 如果一个列定义为一个小整数,那么与它比较的宿主变量也应当声明为相同的定义(例如COBOL中声明为S9(4) comp)。这在DB2 V8和V9中已经有显著改进,在这两个版本中,DB2会更高效地处理进行比较的不同数值数据类型和不同字符串。DB2中可定义的数据类型并非在所有开发语言中都可用,在过去这会带来一些问题。不过从一般经验来看,将数据类型声明为与列定义匹配,可以确保最高的性能和最大程度的优化。例如,如果一个列定义为整数数据类型,那么谓词中包含比较值的宿主变量也应该定义为整数(而不是小整数、小数、浮点数,等等)。COBOL程序员应当尽可能利用已创建的DCLGEN宿主变量来确保完全匹配。DCLG 阅读全文
posted @ 2013-07-12 09:14 小土_ 阅读(268) 评论(0) 推荐(0) 编辑