2016-02-25 1 views
0

Лучше использовать производные таблицы для расчета агрегатов или объединения. В приведенном ниже примере производная таблица представляет собой весь запрос, но производительность более разумна? ** У меня нет плана запроса и не могут увидеть разницу в Потратьте% **Производные таблицы против присоединения

  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; 

против

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;