SQL查询 - 类似的查询,执行时间差异很大

时间:2018-05-18 19:26:22

标签: sql sql-server-2012 execution-time

证书(或调查)被分配给跨越不同区域和区域的一系列设施(一个区域包含多个区域)。这些设施应该响应调查,并使用ResponseDate将它们的响应记录在数据库中(通常为空,直到它们响应)。

我正在尝试计算区域内以及区域内的响应计数。查询几乎完全相同,但跨越更多设施(即按区域)的查询是即时执行的,另一个是按地区执行,需要104秒!我检查了表格,看看AREA和DISTRICT表之间是否有任何区别,但没有找到任何结果;花了大部分时间,无法弄清楚出了什么问题。

Table FACILITYDATA: FACID, AREAID, DISTRICTID.
Table AREA: AREAID, AREA
Table DISTRCIT: DISTRICTID, AREAID, DISTRICT
Table FACILITYCERTIFICATE: FACCERTIFICATEID, FACID, CERTITEMID
Table FACILITYCOMPLICANCE: FACCERTIFICATEID, RESPONSEDATE

-- National, by Area (almost instant result)

select a.Area, sum(case when fcom.ResponseDate is not null then 1 else 0 end) Cnt_Certified 
from FacilityCertificate fc 
inner join FacilityData fd on fd.FacID = fc.FacilityID 
inner join Area a on a.AreaID = fd.AreaID 
left join FacilityCompliance fcom on fcom.FacCertificateID = fc.FacCertificateID 
where fc.CertItemID = 1 
group by a.Area 
order by a.Area;

-- by District, within given Area -- Takes 104 seconds
select d.District, sum(case when fcom.ResponseDate is not null then 1 else 0 end) Cnt_Certified 
from FacilityCertificate fc 
inner join FacilityData fd on fd.FacID = fc.FacilityID 
inner join District d on d.DistrictID = fd.DistrictID
left join FacilityCompliance fcom on fcom.FacCertificateID = fc.FacCertificateID 
where fc.CertItemID = 1 and fd.AreaID = 4
group by d.District 
order by d.District;

我不确定此信息是否足够或需要样本数据。

1 个答案:

答案 0 :(得分:0)

我不确定原因,但是一旦我将“DISTRICT”表中的索引从Clustered更改为Non-Clustered,查询将在0秒而不是104秒内执行。

我正在阅读索引及其设置方式,文章显示使用非群集选项设置一个和我的所有索引,我没有创建但我认为是在我将列设置为主要时创建的键,标记为群集。

也许某人可以对此有所了解但似乎这一改变已经解决了我的问题。感谢所有提到这个问题的人可能与索引有关。