提高DB2查询性能的常用方法
2010-02-16 14:59:59 来源:WEB开发网根据条件语句中的谓词的选择度创建索引
因为建立索引需要占用数据库的存储空间,所以需要在空间和时间性能之间进行权衡。很多时候,只考虑那些在条件子句中有条件判断的列上建立索引会也会同样有效,同时节约了空间。譬如清单5中的查询,可以只建立 (city,cntry_code) 索引。我们还可以进一步地检查条件语句中的这两个谓词的选择度,执行清单6中的语句检查谓词选择度:
清单6.检查谓词选择度
Queries:
1.select count(*) from temp.customer
where city = 'WASHINGTON'
and cntry_code = 'USA';
2.select count(*) from temp.customer
where city = 'WASHINGTON';
3.select count(*) from temp.customer
where cntry_code = 'USA';
Results:
1.1404
2.1407
3.128700
选择度越大,过滤掉的记录越多,返回的结果集也就越小。从清单6 的结果可以看到,第二个查询的选择度几乎有和整个条件语句相同。因此可以直接建立单列索引 (city),其性能与索引 (city,cntry_code,add_date) 具有相差不多的性能。表 1中对两个索引的性能和大小进行了对比。
表 1.两个索引的性能和大小对比
索引 | 查询计划总代价 | 索引大小 |
cust_i1(city,cntry_code,add_date) | 28.94 timerons | 19.52M |
cust_i3(city) | 63.29 timerons | 5.48M |
从表 1中可以看到单列索引 (city) 具有更加有效的性能空间比,也就是说占有尽可能小的空间得到尽可能高的查询速度。
避免在建有索引的列上使用函数
这是一个很简单的原则,如果在建有索引的列上使用函数,由于函数的单调性不确定,函数的返回值和输入值可能不会一一对应,就可能存在索引中位置差异很大的多个列值可以满足带有函数的谓词条件,因此DB2 优化器将无法进行Matching Index Scan,更坏的情况下可能会导致直接进行表扫描。图6中对比了使用function 前后的存取计划的变化。
图6.使用function 前后的存取计划的变化
更多精彩
赞助商链接