2017-06-09 42 views
1

過濾我有以下查詢其需要一段時間來運行,因爲ir_sales_summary是〜2個十億行:SQL - 更快通過大表或小表

select c.ChainIdentifier, s.SupplierIdentifier, s.SupplierName, we.Weekend, 

sum(sales_units_cy) as TY_unitSales, sum(sales_cost_cy) as TY_costDollars, sum(sales_units_ret_cy) as TY_retailDollars, 

sum(sales_units_ly) as LY_unitSales, sum(sales_cost_ly) as LY_costDollars, sum(sales_units_ret_ly) as LY_retailDollars 

from ir_sales_summary i 

left join Chains c 
on c.ChainID = i.ChainID 

inner join Suppliers s 
on s.SupplierID = i.SupplierID 

inner join tmpWeekend we 
on we.SaleDate = i.saledate 

where year(i.saledate) = '2017' 

group by c.ChainIdentifier, s.SupplierIdentifier, s.SupplierName, we.Weekend 

(值得注意的,它需要大約3小時運行,因爲它使用的是從舊服務中引入數據的視圖)

我想有一種方法可以加速過濾,因爲我只需要從2017年的數據。我應該從大表(i)或者是從小得多的週末表中篩選(這給我們提供了一週結束日期)?

+0

爲了加快查詢的速度,您可能希望在年份或月份對ir_sales_summary進行分區。 –

+2

您使用'YEAR()'函數可以防止SQL Server在'saledate'上使用索引,我假設它存在。 '年份(i.saledate)='2017''應該是'where i.saledate> = cast('20170101'as datetime2)和i.saledate

+1

這是值得關注的執行計劃。另外,不是在過濾器中使用年份函數,它是否有助於將條件更改爲「i.saledate>'1/1/2017'?另一方面,年份函數返回一個整數,因此將引號從上年度功能的建議,2017年爲某種隱式轉換正在發生的事情在那裏。 – Jeremy

回答

0

試試這個。這可能有所幫助,加入靜態表作爲查詢中的第一個表到事實/動態表將影響我相信的查詢性能。

SELECT c.ChainIdentifier 
    ,s.SupplierIdentifier 
    ,s.SupplierName 
    ,i.Weekend 
    ,sum(sales_units_cy) AS TY_unitSales 
    ,sum(sales_cost_cy) AS TY_costDollars 
    ,sum(sales_units_ret_cy) AS TY_retailDollars 
    ,sum(sales_units_ly) AS LY_unitSales 
    ,sum(sales_cost_ly) AS LY_costDollars 
    ,sum(sales_units_ret_ly) AS LY_retailDollars 
FROM Suppliers s 
INNER JOIN (
    SELECT we 
     ,weeekend 
     ,supplierid 
     ,chainid 
     ,sales_units_cy 
     ,sales_cost_cy 
     ,sales_units_ret_cy 
     ,sales_units_ly 
     ,sales_cost_ly 
     ,sales_units_ret_ly 
    FROM ir_sales_summary i 
    INNER JOIN tmpWeekend we 
     ON we.SaleDate = i.saledate 
    WHERE year(i.saledate) = '2017' 
    ) i 
    ON s.SupplierID = i.SupplierID 
INNER JOIN Chains c 
    ON c.ChainID = i.ChainID 
GROUP BY c.ChainIdentifier 
    ,s.SupplierIdentifier 
    ,s.SupplierName 
    ,i.Weekend