基于DB2的数据库应用系统的性能优化
2007-05-20 16:20:06 来源:WEB开发网核心提示: 在这个查询中,找出报纸单价为0.5元的收订员名单,基于DB2的数据库应用系统的性能优化(4),下层查询返回一组值给上层查询,然后由上层查询块再根据下层块提供的值继续查询,并进行排序来删除重复记录,这会大大增加查询和I/O的操作次数,在这种嵌套查询中,对上层查询的每一个值OrderNo
在这个查询中,找出报纸单价为0.5元的收订员名单。下层查询返回一组值给上层查询,然后由上层查询块再根据下层块提供的值继续查询。在这种嵌套查询中,对上层查询的每一个值OrderNo,下层查询都要对表OrderDetail进行全部扫描,执行效率显然不会高。在该查询中,有2层嵌套,如果每层都查询1000行,那么这个查询就要查询100万行数据。在系统开销中,对表Order的扫描占82%,对表OrderDetail的搜索占16%。如果我们用连接来代替,即:
SELECT CreateUser
FROM Order,OrderDetail
WHERE Order.OrderNo=OrderDetail.OrderNo AND Praice=0.5
那么对表Order的扫描占74%,对表OrderDetail的搜索占14%。
而且,一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
4. 通配符
在SQL语句中,LIKE关键字支持通配符匹配,但这种匹配特别耗费时间。例如:SELECT * FROM Order WHERE CreateUser LIKE ‘M_ _ _’ 。即使在CreateUser字段上建立了索引,在这种情况下也还是采用顺序扫描的方式,Order表中有1000条记录,就需要比较1000次。如果把语句改为SELECT * FROM Order WHERE CreateUser >’M’ AND CreateUser <’N’,在执行查询时就会利用索引来查询,显然会大大提高速度。
5. distinct
使用distinct是为了保证在结果集中不出现重复值,但是distinct会产生一张工作表,并进行排序来删除重复记录,这会大大增加查询和I/O的操作次数。因此应当避免使用distinct关键字。
更多精彩
赞助商链接