sql 关于多表关联 优化问题
最近 有20w 的数据执行查询,还要多表关联值(已写成试图),查询起来很慢!
求优化,求解释,求解决办法!
[解决办法]
弄成视图本来就不会有什么效率提升。贴执行计划吧
[解决办法]
看了一下你的执行计划,问题有几个:
1、[ICCL_OA_20100519].[dbo].[F_Company_EU_Contact].Company_ID 这个,用了排序,估计你的聚集索引不在这个列上或者没有按照Company_ID升序来建聚集索引,这一步是开销最大的。把聚集索引建在这列或者包含这列,并按这列升序排序,可以减少这部分的开销,你这一步对33万数据排序,开销会非常大。
2、你的执行计划每部分的开销都不大,都是1~5%,但是从里面看出你的代码筛选能力非常差,看图:
这里那么多步之后,数据量越来越大,临时结果整整4000M,也就是你带着4G的数据进行运算,之间每一步都是scan,最后返回的结果整整7999M大小,接近8G啊!你确定真的需要26万行的结果?
3、核心问题出在:F_Company_EU_Info和F_Company_EU_Contact这两个表,不能很好地筛选掉没用的数据,主要是没有where条件,所以随着这两个表的增大,你的查询会越来越慢。
4、尝试把这部分改写一下,试下使用UNION ALL或者用case when来代替多次left join
F_Company_EU_Contact a
LEFT JOIN ( SELECT PP_VALUE ,
PP_NAME
FROM SYSTEM_PARAMETERS
WHERE PP_TABLE = 'F_Company_EU_Contact'
AND PP_FIELD = 'Status'
) b ON a.Status = b.PP_VALUE
LEFT JOIN ( SELECT PP_VALUE ,
PP_NAME
FROM SYSTEM_PARAMETERS
WHERE PP_TABLE = 'F_Company_EU_Contact'
AND PP_FIELD = 'IS_MAINCONTACT'
) c ON a.IS_MAINCONTACT = c.PP_VALUE
LEFT JOIN ( SELECT PP_VALUE ,
PP_NAME
FROM SYSTEM_PARAMETERS
WHERE PP_TABLE = 'F_Company_EU_Contact'
AND PP_FIELD = 'Job_Role'
) d ON a.Job_Role = d.PP_VALUE
select *
from F_Company_EU_Info a left join F_Temp_Project h
on a.TP_ID=h.TP_ID left join Sys_Mapping c
on a.Partner_Name=c.Mapping_ID left join vw_MapToArea e
on a.Area_ID=e.Area_ID left join F_Company_EU_Contact b
on a.Company_ID=b.Company_ID
isnull(e.Status,'<空>') as Status,
isnull((select PP_VALUE from SYSTEM_PARAMETERS where PP_TABLE='F_Company_EU_Contact' and PP_FIELD='Status' and b.PP_VALUE=F_Company_EU_Contact.Status)'<空>') as Status,