我想从一个很好的大小(18,243,847行)的表中总结横幅广告视图。我需要在过去两年中收集意见。我试着给日期添加一个索引,并尝试下面查询的不同变体。大多数运行时间大约是25秒,但是当它在Web服务中传递时,目标页面超时。我知道问题与计数有关,但无法将该部分降至11秒以下。似乎不是很多,但为什么我的网络服务的问题?无论如何,首先要做的是,这个查询是否能够做到最好?优化缓慢运行计数查询
SELECT ba.adID, ba.name, ba.description, ba.startDate, ba.endDate, isNull(v.viewCount,0) AS viewCount, isNull(c.clickCount,0) AS clickCount
FROM bannerAds ba
LEFT OUTER JOIN (SELECT adID, count(viewID) AS viewCount
FROM bannerAdsViews
WHERE viewDateTime IS NOT NULL AND viewDateTime >= DateAdd(yy, -2, GetDate())
GROUP BY adID) v ON ba.adID = v.adID
LEFT OUTER JOIN (SELECT adID, count(viewID) AS clickCount
FROM bannerAdsViews
WHERE clickDateTime IS NOT NULL AND viewDateTime >= DateAdd(yy, -2, GetDate())
GROUP BY adID) c ON ba.adID = c.adID
WHERE viewCount > 0
ORDER BY name ASC
FOR XML RAW ('Banner'), ROOT ('Banners');
不是每个人都回答的问题,但为什么不为每个横幅创建数据的每日总结视图,然后查询。因此,如果您随后将此更新作为计划作业,触发器或记录这些统计信息的一部分的一部分,而不是遍历1800万条记录,则只需查看几百条记录(取决于您的日期范围)每次要运行此查询时都必须继续完成计算。 –
为了优化查询,我首先运行语句解释,否则只会优化错误的部分。 – AlexN