首页 新闻 会员 周边 捐助

sql 优化

0
悬赏园豆:20 [已关闭问题] 关闭于 2012-11-15 10:44

select t.IndClassCode,g.RecordId,c.IndName from tcIndClass c
inner join xylg_SCJGJ_TdBase t  on t.IndClassCode=c.Code
inner join (select aicEntCode,RecordID from xylg_YJJ_GSPCog where uDate between '2008-11-05' and '2012-11-14') g on t.EntId=g.aicEntCode

此SQL语句执行一次大约3分钟,请问有更好的解决方案吗?目的:根据大类(tcIndClass)统计数据,但要查询大类必须关联xylg_SCJGJ_TdBase,xylg_SCJGJ_TdBase大约200万数据左右。

问题补充:

每个表进行关联的字段都有建索引

-----的主页 ----- | 初学一级 | 园豆:99
提问于:2012-11-14 10:46
< >
分享
所有回答(4)
0

用LEFT JOIN 会好些。 看你需求必须用inner join的话 只能这样了

sym_cn | 园豆:798 (小虾三级) | 2012-11-14 11:38

left join试过了,效果一样的

支持(0) 反对(0) ----- | 园豆:99 (初学一级) | 2012-11-14 11:39
0

日期的过滤放到JOIN的里面,group by 的字段为主表C 的IndName,并且对其加索引,语句where uDate>='2008-11-05' and uDate<='2012-11-14'的自动增加索引。试试下面的语句
select c.IndName,count(c.IndName) as IndCount from tcIndClass c  
inner join (select  aicEntCode  FROM xylg_YJJ_GSPCog   where uDate>='2008-11-05' and uDate<='2012-11-14' ) g on t.EntId=g.aicEntCode 
inner join xylg_SCJGJ_TdBase t on t.IndClassCode=c.Code 
 group by c.IndName

acepro | 园豆:1218 (小虾三级) | 2012-11-14 11:44

时间还是无法提高,不过还是得谢谢你。

支持(0) 反对(0) ----- | 园豆:99 (初学一级) | 2012-11-14 11:47

@-----: 
打开执行计划
分别执行关联所用到到的3个表的查询,看下那个的时间耗时最长,然后看看看索引是否有问题。
比如:
查看select  aicEntCode  FROM xylg_YJJ_GSPCog   where uDate>='2008-11-05' and uDate<='2012-11-14' 的用时

查看 select  IndClassCode  from xylg_SCJGJ_TdBase  的用时

查看select  c.IndName,c.Code from tcIndClass c  的用时

支持(0) 反对(0) acepro | 园豆:1218 (小虾三级) | 2012-11-15 15:58

@-----: 

如果查看select  aicEntCode  FROM xylg_YJJ_GSPCog   where uDate>='2008-11-05' and uDate<='2012-11-14' 的用时就要10多秒,那样的话查询的原因主要耗在了这里了

支持(0) 反对(0) acepro | 园豆:1218 (小虾三级) | 2012-11-15 15:59
0

把查询计划截图看一下,到底那个地方用时最多,才能做针对性的优化

飞来飞去 | 园豆:2057 (老鸟四级) | 2012-11-14 12:49
0

请用存储过程。另外建议用between and 而不用 >= <= 

 

二楼的回答只是在一个表中进行日期判断,可以在三个表中都判断日期一遍。再join.

三十三块 | 园豆:373 (菜鸟二级) | 2012-11-14 16:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册