Оптимизация SQL / настройка - PullRequest
1 голос
/ 14 августа 2010

У меня есть запрос SQL Server

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

У меня более 1 000 000 строк, и он работает как дерьмо.Что делать - помогите пожалуйста.

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 14 августа 2010

Неудивительно, что он работает медленно: у вас есть 5 взаимосвязанных подзапросов, 2 из которых не нужны и 3 можно переписать.Попробуйте это.

Кроме того, вам нужен индекс для одного из них, не могу точно сказать, какой

  1. (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
0 голосов
/ 14 августа 2010

Do IP SiteID, Timestamp, url и SessionGuid уже есть индексы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...