证书(或调查)被分配给跨越不同区域和区域的一系列设施(一个区域包含多个区域)。这些设施应该响应调查,并使用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;
我不确定此信息是否足够或需要样本数据。
答案 0 :(得分:0)
我不确定原因,但是一旦我将“DISTRICT”表中的索引从Clustered更改为Non-Clustered,查询将在0秒而不是104秒内执行。
我正在阅读索引及其设置方式,文章显示使用非群集选项设置一个和我的所有索引,我没有创建但我认为是在我将列设置为主要时创建的键,标记为群集。
也许某人可以对此有所了解但似乎这一改变已经解决了我的问题。感谢所有提到这个问题的人可能与索引有关。