OLTP应用程序的DB2调优技巧
2009-12-12 14:59:20 来源:WEB开发网确保应用程序持有锁的时间尽可能短。
当用户操作涉及多个交互作用时,每个交互作用应当提交自己的事务并且应当在将活动返回给用户之前释放所有锁。通过尽可能晚地启动事务的第一个 SQL 语句(它启动一个事务)并使事务的更新(插入、更新和删除,这些操作要用到互斥锁)尽可能接近提交阶段,从而使事务的持续时间尽可能的短。
使用 DB2 注册表参数 DB2_RR_TO_RS,通过不锁定插入或更新行的下一个键,可以改进并发性。如果对同一组表进行操作的任何程序都没有使用隔离级别 RR(可重复读,Repeatable Read),那么就可以使用上述操作。使用 DB2 快照(DB2 Snapshot)监控死锁和锁等待的数目。
使用存储过程或复合 SQL 使网络成本降到最低。
将用于 SQL 语句的网络往返通信次数降至最低,可以减少网络等待时间和上下文切换,这样可以使应用程序持锁的时间更短。通常,当 OLTP 事务有 4 个或 5 个以上语句时应当使用存储过程。
另一方面,如果应用程序逻辑中涉及了某个复杂的 CPU 密集型处理,那么将它放在运行于数据库服务器上的存储过程中会用光数据库服务器上的额外 CPU 周期,从而牺牲一些数据库操作。在这种情况下,要么不使用存储过程,要么在客户机端执行一部分逻辑,而在存储过程中执行其余的逻辑。
有效地使用 SQL。
通常,如果一条 SQL 语句能完成任务,那么就不使用多条 SQL 语句。当通过在查询中设置更多谓词来提供更详细的搜索条件时,优化器就有机会作出更好的选择。您还应该使查询具有可选择性,这样数据库就不会返回您不需要的行和列。例如,使用 SQL 来过滤您想要的行;不用返回所有行,然后要求应用程序执行过滤操作。
分析存取方案。
使用可视化说明(Visual Explain)或 db2exfmt 来分析每一条 SQL 语句。请确保使用合适的索引,从而在选择和连接(join)表时,将必须在内部访存的行数减到最少。
更新目录统计信息
背景知识
RUNSTATS 实用程序用于更新系统目录表中的统计信息,以帮助查询优化过程。如果没有这些统计信息,数据库管理器可能会做出对 SQL 语句的性能产生不利影响的决定。RUNSTATS 实用程序允许您收集表和/或索引中所包含数据的统计信息。使用 RUNSTATS 实用程序收集基于表和索引数据的统计信息,以便为下列情形中的存取方案选择过程提供精确的信息:
当向表装入数据并创建了合适的索引时。
当用 REORG 实用程序重新组织表时。
当存在大量影响表及其索引的更新、删除和插入操作时。(此处的“大量”可能意味着 10% 到 20% 的表和索引数据都受到了影响。)
在绑定性能至关重要的应用程序之前。
当您希望将新的和以前的统计信息进行比较时。定期进行统计使您能够在早期阶段发现性能问题。
当预取数量发生变化时。
当您已经使用了 REDISTRIBUTE NODEGROUP 实用程序时。
当对 SQL 查询进行优化时,SQL 编译器所做出的决定会受到优化器的数据库内容模型的重大影响。优化器使用该数据模型来估计可以用于解决某个特定查询的其它存取路径的成本。数据模型中的关键元素是一组统计信息,该统计信息收集了有关数据库中所包含的数据和系统目录表中所存储的数据的信息。这包括表、别名(nickname)、索引、列和用户定义的函数(UDF)的统计信息。数据统计信息中的变化会引起对存取方案的选择发生变化,该存取方案作为访问所期望数据的最有效方法。
下面列举了一些统计信息,这些统计信息可以帮助给优化器定义数据模型:
表中的页数和非空的页数。
从原始页移到其它(溢出)页的程度。
表中的行数。
有关单个列的统计信息,比如一列中唯一值的数量。
一个索引的群集程度;即,表中行的物理顺序与索引的符合程度。
有关索引的统计信息,比如索引级别的数量和每个索引中叶子页的数量。
经常使用的列值的出现次数。
列值在列中所有值中的分布状况。
用户定义的函数(UDF)的成本估计。
RUNSTATS 可以帮助您确定对数据库的更改与性能之间的关系。统计信息显示出表中的数据分布状况。常规使用时,RUNSTATS 提供了在一段时期内有关表和索引的数据,从而随着时间的流逝,可以确定数据模型的性能趋势。在使用 RUNSTATS 之后需要重新绑定使用静态 SQL 的应用程序,这样查询优化器就可以选择新统计信息所给出的最佳存取方案。但是,对于使用动态 SQL 的应用程序(比如大多数供应商应用程序)而言,没必要进行重新绑定,因为语句的优化是根据统计信息在运行时进行的。当有关表的统计信息不准确时,可能会造成性能问题。最糟的情况是,某个特定的 SQL 语句可能会造成 DB2 使用表扫描而不是使用索引扫描。
如何更新统计信息
只有当进行显式的请求时,对象的统计信息才会在系统目录表中被更新。有几种方法可以更新部分或全部统计信息:
使用 RUNSTATS(运行统计信息,run statistics)实用程序。
使用带有指定的统计信息收集选项的 LOAD。
对针对一组预先定义的目录视图进行操作的 SQL UPDATE 语句进行编码。
使用“reorgchk update statistics”命令。
当您不完全知道所有表名或表名实在太多时,进行 RUNSTATS 的最简单方法就是使用“db2 reorgchk update statistics”命令。正确的脚本如下:
db2 -v connect to DB_NAME
db2 -v "select tbname, nleaf, nlevels, stats_time from sysibm.sysindexes"
db2 -v reorgchk update statistics on table all
db2 -v "select tbname, nleaf, nlevels, stats_time from sysibm.sysindexes"
db2 -v terminate
我们上面所选的示例不需要表名。这一命令对所有表执行 RUNSTATS。
记住: 在填充数据库之后再运行 RUNSTATS 实用程序。
如果您知道表名并且想避免对大量表运行 RUNSTATS 实用程序(因为这样做可能要花很长时间),那么一次对一张表进行 RUNSTATS 更为可取。命令如下:
db2 -v runstats on table
TAB_NAME and indexes all
这个命令将收集该表及其所有索引(基本级别)的统计信息。
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››db2 命令选项解释
- ››应用程序的配置管理Poco
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 基础: 表空间和缓冲池
- ››DB2 XML 编程,第 1 部分: 理解 XML 数据模型
更多精彩
赞助商链接