declare @biz_date varchar(7) set @biz_date = '2016-10'
select '达成率' kpi,
4 as sort,
v.emp_id,
count(distinct v.store_id)*1.0/nullif(count(distinct m.store_id),0) v
FROM TB_CALL_PLAN v with(nolock)
inner join TB_STORE m with(nolock)
on m.org_id = v.org_id and m.state = '1'
WHERE v.business_date LIKE @BIZ_DATE+'%'
group by V.EMP_ID
这段代码运行时间是1分17秒,要计算某个人员的 达成率,逻辑也是很简单,其中的2个表是多对多的关系。
仔细想想慢可能是由于这种多对多的关系,一下子把数据集放大了好多倍,最后又通过group by 来去重 count(distinct store_id),所以就慢了。
于是修改了代码:
declare @biz_date varchar(7) set @biz_date = '2016-10'
select '达成率' kpi,
4 as sort,
v.emp_id,
count(distinct v.store_id)*1.0/nullif(c,0) v
FROM TB_CALL_PLAN v with(nolock)
inner join
(
select m.org_id,
count(*) as c
from TB_STORE m with(nolock)
where m.state = '1'
group by m.org_id
)m
on m.org_id = v.org_id
WHERE v.business_date LIKE @BIZ_DATE+'%'
group by V.EMP_ID,c