开发人员编写SQL代码时,为了确保得到更好的性能,需要采取一些措施,下面会列出其中最有效的一些做法。在关系型数据库管理系统(relational database management system,RDBMS)中,通常90%的运行时问题源于10%的应用问题。与以往相比,如今的DB2优化工具在选择正确的访问路径来满足SQL需求方面已经更胜一筹,不过仍不能保证百分之百正确。目前的所有调优工作都与CPU使用、I/O和并发直接关联。本章的大部分内容都会针对SQL编码,不过所有内容都与性能和调优有关。
本书中给出的技巧和提示是为开发人员提供的一般最佳实践,适用于大多数RDBMS。在这些数据库系统中,可能有一些基于成本的优化工具,它们会查看所有可用的选项,构建一个SQL查询集,并尽其所能给出最高效的访问路径。对于不同的优化工具,可用的选项可能或多或少,不过一般而言,本书中的技巧可以应用于任何数据库管理系统。
程序编写不当或者SQL语句编写不正确,这些通常就是导致性能低下的罪魁祸首。看起来学习和掌握SQL语言很容易,不过在性能方面,DB2优化工具处理SQL语言时存在很多低效问题。开发人员、测试人员、DBA和业务分析师等都能从本书中获益,因为本书特别针对如何编写合适的SQL来提高效率提供了很多技巧。
本书的重点是增强开发人员对调优方法的认识,更多地了解IBMDB2关系型数据库环境中如何改善性能和调优。本书条理清楚、通俗易懂,提供了大量开发技巧、建议和SQL编码示例,所有这些的最终目的都是为了得到更好的性能。
这里的SQL编码示例会用到一些DB2示例表,这些示例表在各个DB2网站中都能找到,另外在所有IBM DB2手册中都有提到。
导致应用、程序或查询性能低下最常见的原因是什么?
数据库设计不当
应用设计不当
SQL查询结构不合理
编目统计不当/不充分
系统类资源(如缓冲区池、RID池和记录日志)分配不当
以下是解决未能合理优化的一些方法:
用不同的方法重写查询
采用不同方式重写查询中的谓词
改变数据库对象的设计
改变数据库分区的设计
为已经存在的表增加一个分区策略
管理、修改或增强编目统计,以涵盖非标准统计
修改系统资源
要记住,DB2优化工具只能做到:
接受SQL查询
验证语法
确认DB2编目有效性
检查查询中对象的编目统计
对所有不同的访问路径计算成本
选择成本最低的访问路径
计算分区值,确定满足SQL数据请求所需的目标分区
作为开发人员,你应该掌握这个领域的大部分内容,这很重要,这样才能在分析性能问题时对调优有所认识。优化工具只能处理编目中的信息,另外只能处理如何建构和设计查询及程序。
一旦找出性能问题,解决这个问题的最佳方法是什么?如前所述,需要对很多方面进行分析,而且其中很多都由开发人员掌控。关于要查找什么以及要做些什么,作为开发人员我们了解得越多,我们在公司里的价值就越高,地位就越重要。
接下来会为开发人员提供100多个技巧,在对特定的查询或程序调优时,这些技巧可以帮助你正确地考虑和分析。最前面的20到25个技巧可能是最常用的,其余的技巧没有特定的顺序,不过关于DB2 V9和V10的技巧会放在最后介绍。
1. 去除在谓词列上编写的任何标量函数
肯定有办法重写谓词,使得谓词列上不再使用函数。要记住:在SQL语句的Select部分对列编写标量函数是完全可以的,不过如果在Where部分中对列使用函数,就会自动将谓词变成不可索引的谓词,并成为一个Stage 2谓词。例如:
- SELECT EMPNO, LASTNAME
- FROM EMP
- WHERE YEAR(HIREDATE ) = 2005
应当写为:
- SELECT EMPNO, LASTNAME
- FROM EMP
- WHERE HIREDATE BETWEEN '2005-01-01' and '2005-12-31'
如上所示重写这个语句之后,DB2可以选择使用列HIREDATE上的索引(如果存在这样一个索引)。但是如果在谓词中使用了YEAR函数,DB2就无法使用该列的索引了。
DB2 V9中,在列上创建索引时可以使用函数。V9称之为表达式索引(Index on Expression)。用函数和/或表达式创建这种表达式索引时,DB2会查看索引,如果它与SQL语句中的具体SQL函数和/或表达式匹配,就会使用这个索引。需要注意,即便如此,仍然要尽可能像上面那样重新编写查询。维护更多的索引可能成本很高,因为这样一来DBA需要管理的索引也会更多,而且它们会增加插入、删除和一些更新的成本。例如:
- CREATE INDEX XEMP4 ON
- EMP (YEAR(HIREDATE ) )
- USING STOGROUP ...
- PRIQTY ... SECQTY ...