SQL - 更快地过滤大表或小表

时间:2017-06-09 13:39:53

标签: sql sql-server-2008

我有以下查询需要一段时间才能运行,因为ir_sales_summary是大约20亿行:

array_combine(array_column($records, 'ContractorName'),array_column($records, 'BonusAmount'));

(值得注意的是,由于它使用的是从旧服务中获取数据的视图,因此需要大约3个小时才能运行)

我认为有一种加速过滤的方法,因为我只需要2017年的数据。我应该从大表(i)过滤还是从更小的周末表过滤(这只给我们一周的结束日期)?

1 个答案:

答案 0 :(得分: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