求一个多表查询SQL的优化。

programeyonger 2009-12-23 05:13:48
select a.e_employee_id,a.e_employee_no,a.e_full_name,e.*,c.e_badge_number,b.e_join_date
from (
select e_employee_id,e_employee_no,e_full_name from ev_employee employee where e_deleted =0) a,
(select e_employee_id,e_join_date from ev_emp_job where e_employment_status =1)b,
ev_tms_employee c,
(select e_employee_id from ev_tms_emp_sch_grp_change_tracker where e_current_schedule_group =1) d,
(select e_employee_id,e_attendance_date,e_shift_id,e_late_in,e_early_out,e_break_late_in,e_break_early_out,
e_absence,e_irregular,e_leave_code,e_total_raw_ot_time,e_total_rounded_ot_time,e_total_raw_working_hours,e_approved_ot
from e_tms_attendance_view where e_attendance_date>= '2002-12-01 00:00:00.000' and e_attendance_date <= '2009-01-01 00:00:00.000') e
where a.e_employee_id =b.e_employee_id and a.e_employee_id =c.e_employee_id and a.e_employee_id =d.e_employee_id and a.e_employee_id =e.e_employee_id

~~~~~~~~~~~~~~~~~~~~~~~~~
共计5张表,目前时间大概是1分钟,希望能提高一半的速度。
...全文
108 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
programeyonger 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hery2002 的回复:]
减少子查询,使用LEFT JOIN方式,
MS你的d表没有用?为啥要加上d表,
另外B表也只用了一个字段,可以使用栏位级别的子查询方式,
下班了,具体实现方式看别人的.只提供个思路.
[/Quote]
d 表还有一个可能的条件是 程序传进来的。我这里没有写出来。
请问B表的 栏位级别的子查询,怎么去做?
liuxg1981 2009-12-24
  • 打赏
  • 举报
回复
中间的五个查询拿掉,直接查询。如7楼所写,我是觉的快一点,但是没有什么根据!
dawugui 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 programeyonger 的回复:]
子查询太多了 也不会降低速度吗?
我的思路是,先用条件把结果集变小,然后再去join,这样不会提高点效率吗?
欢迎高手交流。
[/Quote]
不会.
子查询的工作就耗去你的时间了.
programeyonger 2009-12-24
  • 打赏
  • 举报
回复
子查询太多了 也不会降低速度吗?
我的思路是,先用条件把结果集变小,然后再去join,这样不会提高点效率吗?
欢迎高手交流。
programeyonger 2009-12-23
  • 打赏
  • 举报
回复
是不是 有一种说法, 数据表记录少的表,放在中间,查询起来速度会快一点?
luoyoumou 2009-12-23
  • 打赏
  • 举报
回复
SELECT a.e_employee_id, a.e_employee_no, a.e_full_name,
e.e_employee_id, e.e_attendance_date,e.e_shift_id,e.e_late_in,
e.e_early_out,e.e_break_late_in,e.e_break_early_out,e.e_absence,
e.e_irregular,e.e_leave_code,e.e_total_raw_ot_time,e.e_total_rounded_ot_time,
e.e_total_raw_working_hours,e.e_approved_ot,
c.e_badge_number,b.e_join_date
FROM ev_employee a
INNER JOIN e_tms_attendance_view e
ON a.e_employee_id =e.e_employee_id
AND e.e_attendance_date>= '2002-12-01 00:00:00.000'
AND e.e_attendance_date <= '2009-01-01 00:00:00.000'
INNER JOIN ev_tms_employee c
ON a.e_employee_id =c.e_employee_id
INNER JOIN ev_tms_emp_sch_grp_change_tracker d
ON a.e_employee_id =d.e_employee_id
AND d.e_current_schedule_group=1
INNER JOIN ev_emp_job b
ON a.e_employee_id =b.e_employee_id
AND b.e_employment_status =1
WHERE a.e_deleted =0;
Terry717 2009-12-23
  • 打赏
  • 举报
回复
查询速度慢有很多因素, 比如说: 表的数据很多, 表中没有主键(聚集索引), 还有就是SQL语句用了太多的子查询等.

还是给出表的数据,这样才好帮你分析和解决嘛!
hery2002 2009-12-23
  • 打赏
  • 举报
回复
减少子查询,使用LEFT JOIN方式,
MS你的d表没有用?为啥要加上d表,
另外B表也只用了一个字段,可以使用栏位级别的子查询方式,
下班了,具体实现方式看别人的.只提供个思路.
jwwyqs 2009-12-23
  • 打赏
  • 举报
回复
路过
--小F-- 2009-12-23
  • 打赏
  • 举报
回复
连接字段加索引
比如a.e_employee_id,b.e_employee_id 等
幸运的意外 2009-12-23
  • 打赏
  • 举报
回复
还是楼主吧5张表的表结构给出来吧.看查询看的有点晕了.
dawugui 2009-12-23
  • 打赏
  • 举报
回复
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧