2010-08-14 2 views
1

У меня есть этот запрос, SQL SERVERSQL оптимизации/настройки

SELECT count(distinct [IP]) as GlobalUniqueIPcount, 
    --RangeUniqueIPcount 
    (SELECT count(distinct [IP]) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, [email protected], (LEFT(GETDATE(),12))))) as RangeUniqueIPcount, 
    --RangeUrlUniqueIPcount 
    (SELECT count(distinct [IP]) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, [email protected], (LEFT(GETDATE(),12)))) AND Url = @Url) as RangeUrlUniqueIPcount, 
    --RangeUniquePageviews 
    (SELECT count (distinct url + SessionGuid) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, [email protected], (LEFT(GETDATE(),12))))) as RangeUniquePageViews, 
    --RangeUrlUniquePageviews 
    (SELECT count (distinct url + SessionGuid) FROM [tblSequence] WHERE SiteID = @siteID AND ([Timestamp] > DATEADD(dd, [email protected], (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 

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

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

+0

Что говорит план выполнения? – lmsasu

ответ

3

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

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

  1. (SiteID, Timestamp, Url) с ВКЛЮЧИТЬ на (IP, SessionGuid)
    • (SiteID, Timestamp) с ВКЛЮЧИТЬ на (IP, SessionGuid, Url)
    • (SiteID) with INCLUDE на (IP, Url, SessionGuid, Timestamp)

Это зависит от того, будет ли использоваться 1-й буксир RangeMatch и URLmatch. Мое предположение - это номер 2 или 3. Это важно для размера индекса.

Count игнорирует 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, [email protected], (LEFT(GETDATE(),12))) THEN 1 ELSE 0 END AS RangeMatch 
    FROM 
    [tblSequence] 
    WHERE SiteID = @siteID 
) foo 
+0

Msg 156, Level 15, State 1, Line 23 Неверный синтаксис рядом с ключевым словом 'distinct'. Msg 156, уровень 15, состояние 1, строка 38 Неверный синтаксис рядом с ключевым словом «CASE». –

+0

@ seo20: Отсутствует запятая после URLMatch ... исправлено – gbn

+0

Msg 156, уровень 15, состояние 1, строка 34 Неверный синтаксис рядом с ключевым словом «CASE». –

0

ли IPSiteID, Timestamp, url и SessionGuid уже есть индексы?

+1

Добавьте некоторые индексы, как указано выше, а затем посмотрите план выполнения - до и после этого шага. – lmsasu

+0

Индивидуальные индексы будут бесполезны. Необходимо покрывать или комбинировать. – gbn