【发布时间】:2016-01-07 18:02:22
【问题描述】:
更新:我会尽快得到查询计划。
我们有一个性能很差的查询,需要 4 分钟才能用于特定组织。在通常的重新编译存储过程和更新统计信息没有帮助之后,我们将 if Exists(...) 重新编写为一个 select count(*)... 以及从 4 分钟到 70 毫秒的存储过程。使 70 毫秒查询需要 4 分钟的条件有什么问题?查看示例
这些都需要 4 分钟以上:
if (
SELECT COUNT(*)
FROM ObservationOrganism omo
JOIN Observation om ON om.ObservationID = omo.ObservationMicID
JOIN Organism o ON o.OrganismID = omo.OrganismID
JOIN ObservationMicDrug omd ON omd.ObservationOrganismID = omo.ObservationOrganismID
JOIN SIRN srn ON srn.SIRNID = omd.SIRNID
JOIN OrganismDrug od ON od.OrganismDrugID = omd.OrganismDrugID
WHERE
om.StatusCode IN ('F', 'C')
AND o.OrganismGroupID <> -1
AND od.OrganismDrugGroupID <> -1
AND (om.LabType <> 'screen' OR om.LabType IS NULL)) > 0
print 'records';
-
IF (EXISTS(
SELECT *
FROM ObservationOrganism omo
JOIN Observation om ON om.ObservationID = omo.ObservationMicID
JOIN Organism o ON o.OrganismID = omo.OrganismID
JOIN ObservationMicDrug omd ON omd.ObservationOrganismID = omo.ObservationOrganismID
JOIN SIRN srn ON srn.SIRNID = omd.SIRNID
JOIN OrganismDrug od ON od.OrganismDrugID = omd.OrganismDrugID
WHERE
om.StatusCode IN ('F', 'C')
AND o.OrganismGroupID <> -1
AND od.OrganismDrugGroupID <> -1
AND (om.LabType <> 'screen' OR om.LabType IS NULL))
print 'records'
这一切都需要 70 毫秒:
Declare @recordCount INT;
SELECT @recordCount = COUNT(*)
FROM ObservationOrganism omo
JOIN Observation om ON om.ObservationID = omo.ObservationMicID
JOIN Organism o ON o.OrganismID = omo.OrganismID
JOIN ObservationMicDrug omd ON omd.ObservationOrganismID = omo.ObservationOrganismID
JOIN SIRN srn ON srn.SIRNID = omd.SIRNID
JOIN OrganismDrug od ON od.OrganismDrugID = omd.OrganismDrugID
WHERE
om.StatusCode IN ('F', 'C')
AND o.OrganismGroupID <> -1
AND od.OrganismDrugGroupID <> -1
AND (om.LabType <> 'screen' OR om.LabType IS NULL);
IF(@recordCount > 0)
print 'records';
为什么将完全相同的 Count(*) 查询移动到 if 语句中会导致这种退化,或者为什么“存在”比 Count 慢,这对我来说没有意义。我什至在select CASE WHEN Exists() 中尝试了exists(),它仍然是4 多分钟。
【问题讨论】:
-
您查看过查询计划吗?
-
你能发布三个例子之间的查询计划吗?
-
上次查询中的错字? ` AND (om.LabType 'screen' OR om.LabType IS NULL;` 中的未闭合括号
-
@Ingaz - 修正错字 - 谢谢。
-
@DanKaufman:丹,请发送计划。你的问题很有趣。
标签: sql-server