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万数据左右。
每个表进行关联的字段都有建索引
用LEFT JOIN 会好些。 看你需求必须用inner join的话 只能这样了
left join试过了,效果一样的
日期的过滤放到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
时间还是无法提高,不过还是得谢谢你。
@-----:
打开执行计划
分别执行关联所用到到的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 的用时
@-----:
如果查看select aicEntCode FROM xylg_YJJ_GSPCog where uDate>='2008-11-05' and uDate<='2012-11-14' 的用时就要10多秒,那样的话查询的原因主要耗在了这里了
把查询计划截图看一下,到底那个地方用时最多,才能做针对性的优化
请用存储过程。另外建议用between and 而不用 >= <=
二楼的回答只是在一个表中进行日期判断,可以在三个表中都判断日期一遍。再join.