34,590
社区成员
发帖
与我相关
我的任务
分享
/*场景需求:某行业要求查询 原厂货号 不以特定字母开头的 商品销售数据*/
/*已知条件:fact_sale 有千万条数据,Dim_Product 有60万条数据(符合需求筛选出来的商品有7万条)*/
/*问题:三种查询语句哪种执行效率比较高,简单说下理由*/
/*test1*/
SELECT a.Datekey AS '日期' ,
b.OldProductCode AS '原厂货号' ,
b.Color AS '颜色' ,
SUM(ISNULL([SaleQty], 0)) AS '销售量' ,
SUM(ISNULL([SaleAmt], 0)) AS '销售额' ,
SUM(ISNULL([SaleDPAmt], 0)) AS '销售吊牌额'
FROM fact_sale AS a
LEFT JOIN dbo.Dim_Product AS b ON a.ProductID = b.ProductID
WHERE Datekey >= 20160101
AND b.OldProductCode NOT LIKE 'X%'
AND b.OldProductCode NOT LIKE 'T%'
AND b.OldProductCode NOT LIKE 'D%'
AND b.OldProductCode NOT LIKE 'Z%'
AND b.OldProductCode NOT LIKE 'O%'
GROUP BY a.Datekey ,
b.OldProductCode ,
b.Color
/*test2*/
SELECT a.Datekey AS '日期' ,
b.OldProductCode AS '原厂货号' ,
b.Color AS '颜色' ,
SUM(ISNULL([SaleQty], 0)) AS '销售量' ,
SUM(ISNULL([SaleAmt], 0)) AS '销售额' ,
SUM(ISNULL([SaleDPAmt], 0)) AS '销售吊牌额'
FROM fact_sale AS a
INNER JOIN ( SELECT OldProductCode ,
productid ,
color
FROM dbo.Dim_Product
WHERE OldProductCode NOT LIKE 'X%'
AND OldProductCode NOT LIKE 'T%'
AND OldProductCode NOT LIKE 'D%'
AND OldProductCode NOT LIKE 'Z%'
AND OldProductCode NOT LIKE 'O%'
) AS b ON a.ProductID = b.ProductID
WHERE Datekey >= 20160101
GROUP BY a.Datekey ,
b.OldProductCode ,
b.Color ;
/*test3*/
WITH product
AS ( SELECT OldProductCode ,
productid ,
color
FROM dbo.Dim_Product
WHERE OldProductCode NOT LIKE 'X%'
AND OldProductCode NOT LIKE 'T%'
AND OldProductCode NOT LIKE 'D%'
AND OldProductCode NOT LIKE 'Z%'
AND OldProductCode NOT LIKE 'O%'
)
SELECT a.Datekey AS '日期' ,
b.OldProductCode AS '原厂货号' ,
b.Color AS '颜色' ,
SUM(ISNULL([SaleQty], 0)) AS '销售量' ,
SUM(ISNULL([SaleAmt], 0)) AS '销售额' ,
SUM(ISNULL([SaleDPAmt], 0)) AS '销售吊牌额'
FROM fact_sale AS a
INNER JOIN product AS b ON a.ProductID = b.ProductID
WHERE Datekey >= 20160101
GROUP BY a.Datekey ,
b.OldProductCode ,
b.Color
--1. 加计算列
ALTER TABLE Dim_Product ADD notLikeXTDZO AS CASE WHEN
OldProductCode NOT LIKE 'X%' AND
OldProductCode NOT LIKE 'T%' AND
OldProductCode NOT LIKE 'D%' AND
OldProductCode NOT LIKE 'Z%' AND
OldProductCode NOT LIKE '(%' THEN 1 ELSE 0 END
--2. 加索引
CREATE INDEX IX_fact_sale_ProductID ON fact_sale (ProductID)
CREATE INDEX IX_Dim_Product_ProductID ON Dim_Product (ProductID) INCLUDE(OldProductCode,Color)
CREATE INDEX IX_fact_sale_1 ON fact_sale (Datekey) INCLUDE(SaleQty,SaleAmt,SaleDPAmt)
--3. 语句
SELECT a.Datekey AS '日期' ,
b.OldProductCode AS '原厂货号' ,
b.Color AS '颜色' ,
SUM(ISNULL([SaleQty], 0)) AS '销售量' ,
SUM(ISNULL([SaleAmt], 0)) AS '销售额' ,
SUM(ISNULL([SaleDPAmt], 0)) AS '销售吊牌额'
FROM fact_sale AS a
LEFT JOIN dbo.Dim_Product AS b ON a.ProductID = b.ProductID AND b.notLikeXTDZO=1
WHERE Datekey >= 20160101
GROUP BY a.Datekey ,
b.OldProductCode ,
b.Color