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)或者是從小得多的週末表中篩選(這給我們提供了一週結束日期)?
爲了加快查詢的速度,您可能希望在年份或月份對ir_sales_summary進行分區。 –
您使用'YEAR()'函數可以防止SQL Server在'saledate'上使用索引,我假設它存在。 '年份(i.saledate)='2017''應該是'where i.saledate> = cast('20170101'as datetime2)和i.saledate
這是值得關注的執行計劃。另外,不是在過濾器中使用年份函數,它是否有助於將條件更改爲「i.saledate>'1/1/2017'?另一方面,年份函數返回一個整數,因此將引號從上年度功能的建議,2017年爲某種隱式轉換正在發生的事情在那裏。 – Jeremy