日期:2014-05-17  浏览次数:20453 次

sql 关于多表关联 优化问题
最近 有20w 的数据执行查询,还要多表关联值(已写成试图),查询起来很慢! 
求优化,求解释,求解决办法!

优化 sql 视图 多表关联

------解决方案--------------------
语句贴出来,查询计划贴出来
------解决方案--------------------
额。。看这量也快不了~
大量的isnull等函数,查询中使用函数会导致优化器不选择索引
看你那些函数,能不加的就不要加
------解决方案--------------------
执行一下估计查询计划,看看有没有索引缺失,可能的话把查询计划贴上来,等黄版主有空了给你分析分析
------解决方案--------------------
弄成视图本来就不会有什么效率提升。贴执行计划吧
------解决方案--------------------
看了一下你的执行计划,问题有几个:
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