优化大数据运行缓慢的SQL查询

时间:2019-02-01 11:30:29

标签: sql sql-server sql-server-2012

我正在使用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

2 个答案:

答案 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子句,然后重新排列首先考虑具有索引的过滤器。