【发布时间】:2018-10-29 07:01:03
【问题描述】:
证书(或调查)分配给跨越不同地区和地区(一个地区包含多个地区)的一堆设施。这些设施应该对调查做出回应,并且他们的回应会使用 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;
我不确定这些信息是否足够或是否需要样本数据。
【问题讨论】:
-
这可能是很多事情。不同表中的数据大小?或者更有可能一个有索引而另一个没有。 area 表或 FacilityCertificate 表可能在 AreaID 上有索引(一个或两个),但 FacilityCertfiicate 或 District 可能在 DistructID 上没有索引 注意:添加索引可能会解决这种情况,但您不想只是随机添加索引,您将想先检查你的数据库,但在这种情况下,你会特别想检查它,因为它是一个 ID
-
这两列是什么数据类型? Area 是否有建立在其上的索引,而 District 没有?
-
这很可能是不同连接上的索引与无索引。另外,您可能使用什么工具来运行 SQL?
-
这是相同的数据,我只是想对它们进行不同的分组(按地区或按区)。如果您提到的表有索引,我如何签入 SSMS?当我选择 Area 和 District 表时,我看到“indexable:true”和“(is full-text indexed: no)”。
-
FACILITYDATA表中的AREAID和DISTRICTID列是外键,分别指向AREA表中的AREAID和DISTRICT表中的DISTRICTID。
标签: sql sql-server-2012 execution-time