I have this SQL Server query
SELECT count(distinct [IP]) as GlobalUniqueIPcount,
--RangeUniqueIPcount
(SELECT count(distinct [IP]) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, -@days, (LEFT(GETDATE(),12))))) as RangeUniqueIPcount,
--RangeUrlUniqueIPcount
(SELECT count(distinct [IP]) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, -@days, (LEFT(GETDATE(),12)))) AND Url = @Url) as RangeUrlUniqueIPcount,
--RangeUniquePageviews
(SELECT count (distinct url + SessionGuid) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, -@days, (LEFT(GETDATE(),12))))) as RangeUniquePageViews,
--RangeUrlUniquePageviews
(SELECT count (distinct url + SessionGuid) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, -@days, (LEFT(GETDATE(),12)))) AND Url = @Url) as RangeUrlUniquePageViews,
--GlobalUniquePageViews
(SELECT count (distinct url + SessionGuid) FROM [tblSequence] WHERE SiteID = @siteID) as GlobalUniquePageViews
FROM [tblSequence] WHERE SiteID = @siteID
I have more than 1,000,000 rows and it performs like crap.
What to do – please help.
Thanks a lot
No wonder it runs slow: you have 5 correlated subqueries, 2 of which are unnecessary and 3 can be re-written. Try this.
Also, you need an index on one of these, can’t say exactly which
(SiteID, Timestamp, Url)with INCLUDE on(IP, SessionGuid)(SiteID, Timestamp)with INCLUDE on(IP, SessionGuid, Url)(SiteID) with INCLUDEon(IP, Url, SessionGuid, Timestamp)It depends on whether the 1st tow would be used
RangeMatchandURLmatch. My guess is number 2 or 3 will be needed. It matters for index size.Count will ignore NULLs when
*is not used.