我有一个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查询速度和优化的建议?
答案 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也可以提供更有效的查询。只是一个想法。