Неудивительно, что он работает медленно: у вас есть 5 взаимосвязанных подзапросов, 2 из которых не нужны и 3 можно переписать.Попробуйте это.
Кроме того, вам нужен индекс для одного из них, не могу точно сказать, какой
(SiteID, Timestamp, Url)
с INCLUDE на (IP, SessionGuid)
(SiteID, Timestamp)
с ВКЛЮЧЕНО на (IP, SessionGuid, Url)
(SiteID) with INCLUDE
на (IP, Url, SessionGuid, Timestamp)
Зависит от того, будет ли использоваться 1-й буксир RangeMatch
и URLmatch
.Я думаю, номер 2 или 3 будет необходимо.Это имеет значение для размера индекса.
Счетчик будет игнорировать значения NULL, если *
не используется.
SELECT
count(distinct [IP]) as GlobalUniqueIPcount,
--RangeUniqueIPcount
count (distinct CASE
WHEN RangeMatch = 1
THEN IP ELSE NULL
END ) AS RangeUniqueIPcount,
--RangeURLUniqueIPcount
count (distinct CASE
WHEN RangeMatch = 1 AND UrlMatch = 1
THEN IP ELSE NULL
END ) AS RangeURLUniqueIPcount,
--RangeUniquePageviews
count (distinct CASE
WHEN RangeMatch = 1
THEN url + SessionGuid ELSE NULL
END ) RangeUniquePageViews,
--RangeUrlUniquePageviews
count (distinct CASE
WHEN RangeMatch = 1 AND UrlMatch = 1
THEN url + SessionGuid ELSE NULL
END ) RangeUrlUniquePageViews,
--GlobalUniquePageViews
count (distinct url + SessionGuid) as GlobalUniquePageViews
FROM
(SELECT
*,
CASE WHEN Url = @Url THEN 1 ELSE 0 END AS UrlMatch,
CASE WHEN [Timestamp] > DATEADD(dd, -@days, (LEFT(GETDATE(),12))) THEN 1 ELSE 0 END AS RangeMatch
FROM
[tblSequence]
WHERE SiteID = @siteID
) foo