【问题标题】:SQL Query - Similar queries, big difference in execution timeSQL Query - 类似的查询,执行时间差别很大
【发布时间】: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


【解决方案1】:

我不知道为什么,但是一旦我将“DISTRICT”表中的索引从集群更改为非集群,查询在 0 秒而不是 104 秒内执行。

我正在阅读索引以及它们是如何设置的,文章在设置索引时使用非聚集选项显示,我的所有索引都是我没有创建的,但我认为是在我将列设置为主列时创建的键,被标记为集群。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多