摘要:
In和Exists子查询可以生成同样的结果,不过它们的做法截然不同。通常它们的表现各有优劣,这取决于实际的数据分布。例如:SELECTE.EMPNO,E.LASTNAME FROMEMPE WHEREE.EMPNOIN (SELECTD.MGRNO FROMDEPARTMENTD WHERED.DEPTNOLIKE'D%')也可以写为:SELECTE.EMPNO,E.LASTNAME FROMEMPE WHEREEXISTS (SELECT1 FROMDEPARTMENTD WHERED.MGRNO=E.EMPNO ANDD.DEPTNOLIKE'D%')这些相 阅读全文
摘要:
大多数情况下,Distinct函数都会导致对最终结果集完成一次排序,因此,这就成为成本最昂贵的排序之一。Distinct一直是SQL语言中成本最高的函数之一。不过,对于DB2 V9,优化工具会尽量利用索引来消除为确定唯一性所带来的排序,其方法类似于目前用Group By语句完成优化时的做法。不过,实际上不必在SQL中使用Distinct,完全可以使用其他方式重写查询来得到同样的结果,这样做往往更为高效。开发人员现在都很喜欢用Distinct,很多人在所有语句上都会加上Distinct来确保不出现重复。不过这种代码的效率很低。在对应用调优时,我首先要做的事情之一就是审查源代码,找出所有包含Dis 阅读全文
摘要:
如果Select部分包含不需要的列,优化工具会选择Indexonly = ‘N’,这会强制DB2必须进入数据页来得到所请求的特定列,这就要求更多的I/O操作。另外,由于这些多余的列可能是某些排序的一部分,这样一来,就需要创建和传递一个更大的排序文件,相应地会使排序的成本更高。对于排序来讲,其规模大小会直接影响成本。随着排序规模变大,成本也会更昂贵。如果查询中涉及多个表,指定多余的列还会对优化工具选择何种联接类型产生影响。目前,z/OSDB2中有4种联接类型(嵌套循环联接、合并扫描联接、复合联接和星型联接),DB2 LUW中还有一种哈希联接。优化工具会根据不同的原因选择各种联接类型。如果包含了根 阅读全文
摘要:
肯定有办法重写谓词,使得谓词列上不再使用数学运算。在SQL语句的Select部分对列应用数学运算是完全可以的,不过如果在Where部分中对列使用数学运算,就会自动将谓词变成不可索引的谓词。例如:SELECTEMPNO,LASTNAME FROMEMP WHERESALARY*1.1>50000.00应当写为:SELECTEMPNO,LASTNAME FROMEMP WHERESALARY>50000.00/1.1如上所示重写这个SQL语句之后,DB2可以选择使用列SALARY上的索引(如果存在这样一个索引)。但是如果这个语句编写为直接对SALARY列应用数学运算, DB2就无法使用 阅读全文
摘要:
开发人员编写SQL代码时,为了确保得到更好的性能,需要采取一些措施,下面会列出其中最有效的一些做法。在关系型数据库管理系统(relational database management system,RDBMS)中,通常90%的运行时问题源于10%的应用问题。与以往相比,如今的DB2优化工具在选择正确的访问路径来满足SQL需求方面已经更胜一筹,不过仍不能保证百分之百正确。目前的所有调优工作都与CPU使用、I/O和并发直接关联。本章的大部分内容都会针对SQL编码,不过所有内容都与性能和调优有关。本书中给出的技巧和提示是为开发人员提供的一般最佳实践,适用于大多数RDBMS。在这些数据库系统中,可能 阅读全文