【问题标题】:SQL optimization/tweakingSQL 优化/调整
【发布时间】:2011-03-29 20:24:48
【问题描述】:

我有这个 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 行,它的表现就像垃圾一样。 怎么办 - 请帮忙。

非常感谢

【问题讨论】:

  • 执行计划怎么说?

标签: sql sql-server performance tsql optimization


【解决方案1】:

IPSiteIDTimestampurlSessionGuid 是否已有索引?

【讨论】:

  • 按照上面的要求添加一些索引,然后看看执行计划 - 在这一步之前和之后。
  • 单个索引将毫无用处。需要覆盖或复合。
【解决方案2】:

难怪它运行缓慢:您有 5 个相关子查询,其中 2 个是不必要的,3 个可以重写。试试这个。

另外,您需要其中一个的索引,不能确切地说出是哪个

  1. (SiteID, Timestamp, Url) 包括 (IP, SessionGuid)
    • (SiteID, Timestamp) 包括 (IP, SessionGuid, Url)
    • (SiteID) with INCLUDE(IP, Url, SessionGuid, Timestamp)

这取决于是否会使用第一个牵引RangeMatchURLmatch。我的猜测是需要 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, -@days, (LEFT(GETDATE(),12))) THEN 1 ELSE 0 END AS RangeMatch
  FROM
     [tblSequence]
  WHERE SiteID = @siteID
  ) foo

【讨论】:

  • Msg 156, Level 15, State 1, Line 23 关键字“distinct”附近的语法不正确。消息 156,级别 15,状态 1,第 38 行关键字“CASE”附近的语法不正确。
  • @seo20: URLMatch 后缺少逗号...已修复
  • Msg 156, Level 15, State 1, Line 34 关键字“CASE”附近的语法不正确。
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多