首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么group by使sql查询速度如此之快

为什么group by使sql查询速度如此之快
EN

Stack Overflow用户
提问于 2010-12-07 12:39:14
回答 3查看 638关注 0票数 0

下面两个查询给出了相同的结果,但使用group by的查询运行得更快。这是否表明优化的查询会在可能的情况下倾向于使用group by?或者更有可能是我遇到了某种特殊情况?

更快的查询(对我来说不太直观):

代码语言:javascript
复制
SELECT     A.Advertiser
FROM         (SELECT     TOP (100) PERCENT Advertiser, [Final Status]
                       FROM          dbo.Rehenas_View_2
                       GROUP BY [Final Status], Advertiser
                       HAVING      ([Final Status] IS NULL)) AS A INNER JOIN
                          (SELECT     TOP (100) PERCENT Advertiser, [Final Status]
                            FROM          dbo.Rehenas_View_2 AS Rehenas_View_2_1
                            GROUP BY [Final Status], Advertiser
                            HAVING      ([Final Status] = N'final')) AS B ON A.Advertiser = B.Advertiser
GROUP BY A.Advertiser

较慢的查询(当我注意到速度差异时,我正试图简化上面的查询)

代码语言:javascript
复制
SELECT     A.Advertiser
FROM         (SELECT     TOP (100) PERCENT Advertiser, [Final Status]
                       FROM          dbo.Rehenas_View_2
                       WHERE      ([Final Status] IS NULL)) AS A INNER JOIN
                          (SELECT     TOP (100) PERCENT Advertiser, [Final Status]
                            FROM          dbo.Rehenas_View_2 AS Rehenas_View_2_1
                            WHERE      ([Final Status] = N'final')) AS B ON A.Advertiser = B.Advertiser
GROUP BY A.Advertiser
EN

回答 3

Stack Overflow用户

发布于 2010-12-07 17:43:22

根据您的评论,您希望广告商同时具有NULL和Final状态。

这应该会呈现所需的结果。DISTINCT通常意味着“我得到了副本……不知道为什么”,通常它隐藏了一个粉丝陷阱。在这种情况下,每个Advertiser可能有一个'final‘和空行的笛卡尔乘积。

代码语言:javascript
复制
SELECT DISTINCT A.Advertiser 
FROM  dbo.Rehenas_View_2 AS A, 
      dbo.Rehenas_View_2 AS B
WHERE A.[Final Status] IS NULL
  AND B.[Final Status] = N'final'
  AND A.Advertiser = B.Advertiser

2个聚合的内连接:

代码语言:javascript
复制
SELECT Advertiser FROM
(  SELECT Advertiser, COUNT(1) AS StatusCount 
   FROM dbo.Rehenas_View_2 WHERE [Final Status] IS NULL
   GROUP BY Advertiser
   HAVING StatusCount > 0) AS N,
(
   SELECT Advertiser, COUNT(1) AS StatusCount 
   FROM dbo.Rehenas_View_2 WHERE [Final Status] = N'final'
   GROUP BY Advertiser
   HAVING StatusCount > 0) AS F
WHERE N.Advertiser = F.Advertiser

另一个想法是使用CASE,并使用单个GROUP BY/HAVING计算NULL和FINALS

代码语言:javascript
复制
SELECT Advertiser FROM
(  SELECT Advertiser, 
       SUM(CASE WHEN [Final Status] IS NULL THEN 1 ELSE 0 END) AS NullCount, 
       SUM(CASE WHEN [Final Status] = N'final' THEN 1 ELSE 0 END) AS FinalCount 
   FROM dbo.Rehenas_View_2 WHERE [Final Status] IS NULL
   GROUP BY Advertiser
   HAVING NullCount > 0 AND FinalCount > 0)

我没有测试这种语法的环境。

票数 1
EN

Stack Overflow用户

发布于 2010-12-07 12:49:27

这两个查询似乎都要复杂得多。他们给出的结果不是和这个一样吗?

代码语言:javascript
复制
SELECT Advertiser
FROM          dbo.Rehenas_View_2
WHERE [Final Status] IS NULL

UNION

SELECT Advertiser
FROM    dbo.Rehenas_View_2
WHERE [Final Status] = N'final'

这也应该要快得多。

当然,无论何时从视图中进行选择,都不能查看查询本身,还必须查看视图sql。除了是物化视图之外,它与使用子查询几乎相同。

票数 0
EN

Stack Overflow用户

发布于 2010-12-07 13:06:25

如果在这两个查询中删除最外层的group by,是否会看到返回的行数存在差异?这也许能解释这一切。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4373449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档