我正在使用Microsoft sql Server2012。创建了一个查询以获取详细信息,但对于大数据它运行缓慢。这是查询:
SELECT p.BackgroundID,
sum(od.OrderQuantity) AS number
FROM approval.orderdetail od(nolock)
JOIN project p(nolock) ON od.ProjectID = p.projectid
AND p.BackgroundID IS NOT NULL
WHERE CAST(p.ModifiedDateUTC AS DATE) BETWEEN @startDate AND @endDate
AND EXISTS
(SELECT backgroundid
FROM background b
WHERE b.BackgroundID = p.BackgroundID
AND (@isActive = 2
OR b.IsActive = @isActive)
AND (@filtertype = 0
OR ((@filtertype IN (3, 5, 7, 8)
AND b.licenseid IS NULL
AND b.IsAR = 0)
OR (@filtertype IN (1, 4, 5)
AND b.IsAR = 1)
OR (@filtertype IN (2, 4, 6)
AND b.IsLicensed = 1))))
GROUP BY p.BackgroundID
有人可以帮助我优化查询吗?有关优化性能的任何建议。
当前,当我第一次使用大数据第一次运行此查询时,它花费了将近1分钟,而当我再次运行时,它只花费了3秒。
这是执行计划: Execution Plan
答案 0 :(得分:0)
第二次执行它时运行速度更快,因为引擎可以将计划重新用于您第一次运行该查询时创建的查询。因此,现在应该保持这种方式。
如果您仍然不满意,请在问题中包括执行计划。我建议从ModifiedDateUTC中删除CAST
-结果应该相同,但是如果存在此字段,它将阻止在该字段上使用索引。
答案 1 :(得分:0)
尝试一下:
SELECT p.BackgroundID,
sum(od.OrderQuantity) AS number
FROM approval.orderdetail od(nolock)
JOIN project p(nolock) ON od.ProjectID = p.projectid AND p.BackgroundID IS NOT NULL
JOIN background b ON b.BackgroundID = p.BackgroundID
WHERE
(@isActive = 2
OR b.IsActive = @isActive)
AND (@filtertype = 0
OR ((@filtertype IN (3, 5, 7, 8)
AND b.licenseid IS NULL
AND b.IsAR = 0)
OR (@filtertype IN (1, 4, 5)
AND b.IsAR = 1)
OR (@filtertype IN (2, 4, 6)
AND b.IsLicensed = 1))))
AND
CAST(p.ModifiedDateUTC AS DATE) BETWEEN @startDate AND @endDate
GROUP BY p.BackgroundID
尝试使用Exists
重播inner join
子句,然后重新排列首先考虑具有索引的过滤器。