派生表与联接

Derived Tables vs Joins

是使用派生的 table 来计算聚合还是使用连接更好。在下面的示例中,派生的 table 是整个查询,但性能更快? **我没有查询计划,看不到支出百分比的差异 **

           SELECT
              sl_ytd.state,
              sl_ytd.num_stores,
              sl_ytd.ytd_sales
           FROM  
               (SELECT
                  SUM(sis.sales_dollars_ytd) as ytd_sales,
                  COUNT(DISTINCT s.store_key) as num_stores,
                  s.state
               FROM snapshot_item_store sis
               JOIN stores s on s.store_key = sis.store_key
               GROUP BY 
                  s.state) sl_ytd

如果您通过仅引用子 table 来计算派生 table 中的聚合,则 "group by" 可以针对外键上的非聚集索引进行操作。如果您改为执行连接,然后针对所有 return 列计算聚合,它将必须生成一个临时文件 table 并做很多额外的工作。

SELECT
    c.CompanyName,
    ISNULL(cu.UserCount, 0) AS UserCount
FROM
    Company c
        LEFT OUTER JOIN
        (
            SELECT
                u.CompanyID,
                COUNT(*) AS UserCount
            FROM
                [User] u
            GROUP BY
                u.CompanyID
        ) cu ON
            cu.CompanyID = c.CompanyID
ORDER BY
    c.CompanyName;

SELECT
    c.CompanyName,
    ISNULL(COUNT(u.CompanyID), 0) AS UserCount
FROM
    Company c
        LEFT OUTER JOIN [User] u ON
            u.CompanyID = c.CompanyID
GROUP BY
    c.CompanyID
ORDER BY
    c.CompanyName;