带有子查询的DB2 SELECT查询需要很长时间

时间:2015-12-29 06:25:02

标签: database db2

我有一个DB2 SELECT查询需要很长时间才能完成。是否有更简单的方法来实现相同的结果?

Select count(*) 
from leaveprocess,processlog,leave_type, user_master 
where  leaveprocess.process_id = processlog.process_id 
and user_master.user_id = leaveprocess.create_id  
and leaveprocess.leavetype_id = leave_type.serial_no  
and leaveprocess.leave_cust_id=315
and  user_master.user_id!=0 
and user_master.location_id in (2412,2422,2416,2410,2436,2401)  
and user_master.user_id in (
    select employee_id from employee where employee_cust_id=1558 and company_id in (178)
) 
and leaveprocess.leave_id!=0.

大约有60,000名员工记录,但是当我删除country_id check(company_id in (178))时,它的工作速度非常快。

是否有一些提高DB2查询速度和优化的建议?

2 个答案:

答案 0 :(得分:1)

如果没有看到您的计划说明(有关EXPLAIN)或任何表/索引定义的更多详细信息,请参阅here,这很难肯定。

但是,既然你说没有子查询中的company_id字段就快了,我猜你需要一个索引来覆盖employee表上的那个字段。可能类似于employee_cust_id, company_id, employee_id

此外,您不需要将其编写为子查询,您可以将其编写为JOIN(我将您的逗号连接转换为“真正的”连接):

SELECT count(*) 
FROM leaveprocess l
JOIN processlog p
  ON l.process_id = p.process_id 

JOIN leave_type lt
  ON l.leavetype_id = lt.serial_no  

JOIN user_master um 
  ON um.user_id = l.create_id  

JOIN employee e
  ON e.employee_id = um.user_id

where l.leave_cust_id = 315
  and um.user_id     <> 0 
  and l.leave_id     <> 0
  and um.location_id in (2412,2422,2416,2410,2436,2401)  

  and e.employee_cust_id=1558 
  and e.company_id in (178)

答案 1 :(得分:0)

我强烈建议您使用上述帖子中提到的建议,但我很困惑您在(178)中使用e.company_id的原因。 IN运算符通常用于指定多个值。您只需要查找e.company_id 178,因此将其设置为和e.company_id = 178也可以提供更有效的查询。只是一个想法。