派生表与联接
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;
是使用派生的 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;