2016-02-25 130 views
0

使用派生表來計算聚合或使用連接更好嗎?在下面的例子中,派生表是整個查詢,但性能明智嗎? **我沒有查詢計劃,並不能看到支出%的差異**派生表vs連接

  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 
+1

我認爲這是一個壞榜樣,因爲你隨聲是派生表;我認爲你所要求的是作爲一種設計模式,在對一部分聚合進行派生表後,加入到其他表中。答案是「這取決於...」 –

回答

1

如果您只參考子表計算派生表聚集體,「分組依據」可對操作外鍵上的非聚集索引。如果您改爲進行連接,然後針對所有返回列計算聚合,則必須生成臨時表並執行大量額外工作。

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; 

VS

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;