首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么添加这个字段会使我的查询运行缓慢?

为什么添加这个字段会使我的查询运行缓慢?
EN

Stack Overflow用户
提问于 2017-09-05 12:47:53
回答 2查看 292关注 0票数 1

如果我从select列表中去掉一个字段--最后一个字段,att,下面的查询将在不到1秒的时间内运行。但是拥有它会导致查询占用超过一分钟的时间。有什么想法吗?请注意,左侧联接内的子查询自动快速运行。

代码语言:javascript
复制
select p.person_id, cfm.family_id, p.nick_name, p.last_name, s.lookup_value as group_role, gm.active, g.group_id, g.group_name, 
g.active as group_active, tg.category, gc.cluster_name, coalesce(a.attendance,0) as att --this field is the culprit
from smgp_group g
join smgp_group_cluster gc on g.group_cluster_id = gc.group_cluster_id
join smgp_member gm on g.group_id = gm.group_id
join core_person p on gm.person_id = p.person_id
join core_family_member cfm on p.person_id = cfm.person_id
join core_lookup s on gm.role_luid = s.lookup_id
join @target_groups tg on g.group_id = tg.group_id
left join (
  select at.person_id, goc.group_id, count(at.attended) as attendance from core_occurrence_attendance at
  join core_occurrence o on at.occurrence_id = o.occurrence_id
  join smgp_group_occurrence goc on o.occurrence_id = goc.occurrence_id
  where goc.group_id in (select group_id from @target_groups)
  and o.occurrence_start_time between @start_date and @end_date
  group by at.person_id, goc.group_id
) a on p.person_id = a.person_id and g.group_id = a.group_id
where tg.category = 'adults' or (tg.category = 'kids' and s.lookup_value in ('Leader-Teacher','Assistant Leader'))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-05 13:59:31

下面的查询在3秒内运行,解决了问题。谢谢。

代码语言:javascript
复制
select at.person_id, goc.group_id, count(at.attended) as attendance 
into #a
from core_occurrence_attendance at
join core_occurrence o on at.occurrence_id = o.occurrence_id
join smgp_group_occurrence goc on o.occurrence_id = goc.occurrence_id
where goc.group_id in (select group_id from @target_groups)
and o.occurrence_start_time between @start_date and @end_date
group by at.person_id, goc.group_id 

select p.person_id, cfm.family_id, p.nick_name, p.last_name, s.lookup_value as group_role, gm.active, g.group_id, g.group_name, 
g.active as group_active, tg.category, gc.cluster_name, coalesce(#a.attendance,0) as att--, --this field is the culprit
from smgp_group g
join smgp_group_cluster gc on g.group_cluster_id = gc.group_cluster_id
join smgp_member gm on g.group_id = gm.group_id
join core_person p on gm.person_id = p.person_id
join core_family_member cfm on p.person_id = cfm.person_id
join core_lookup s on gm.role_luid = s.lookup_id
join @target_groups tg on g.group_id = tg.group_id
left join #a on p.person_id = #a.person_id and g.group_id = #a.group_id
where tg.category = 'adults' or (tg.category = 'kids' and s.lookup_value in ('Leader-Teacher','Assistant Leader'))
票数 0
EN

Stack Overflow用户

发布于 2017-09-05 13:12:51

试着运行以下程序-

代码语言:javascript
复制
SELECT p.persON_id, cfm.family_id, p.nick_name, 
       p.last_name, s.lookup_value as group_role, 
       gm.active, g.group_id, g.group_name, 
       g.active as group_active, tg.cATegory, 
       gc.cluster_name, a.ATtendance 
  INTO #tempDataset
  FROM smgp_group g
  JOIN smgp_group_cluster gc 
    ON g.group_cluster_id = gc.group_cluster_id
  JOIN smgp_member gm 
    ON g.group_id = gm.group_id
  JOIN core_persON p 
    ON gm.persON_id = p.persON_id
  JOIN core_family_member cfm 
    ON p.persON_id = cfm.persON_id
  JOIN core_lookup s 
    ON gm.role_luid = s.lookup_id
  JOIN @target_groups tg 
    ON g.group_id = tg.group_id
  LEFT JOIN (SELECT AT.persON_id, goc.group_id, count(AT.ATtended) as ATtendance FROM core_occurrence_ATtendance AT
               JOIN core_occurrence o 
                 ON AT.occurrence_id = o.occurrence_id
               JOIN smgp_group_occurrence goc 
                 ON o.occurrence_id = goc.occurrence_id
              WHERE goc.group_id IN (SELECT group_id 
                                       FROM @target_groups)
                                        AND o.occurrence_start_time BETWEEN @start_dATe AND @end_dATe
                                      GROUP BY AT.persON_id, goc.group_id) a 
    ON p.persON_id = a.persON_id 
   AND g.group_id = a.group_id
WHERE tg.cATegory = 'adults' or (tg.cATegory = 'kids' AND s.lookup_value IN ('Leader-Teacher','Assistant Leader'))

SELECT persON_id, 
       family_id, 
       nick_name, 
       last_name, 
       group_role, 
       active, 
       group_id, 
       group_name, 
       group_active, 
       cATegory, 
       cluster_name, 
       coalesce(ATtendance,0) AS ATT
  FROM #tempDataset

如果运行缓慢,您可能可以在temp表上添加一个索引,但作为第一步,我将尝试执行上述操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46055384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档