我经常遇到这样的情况,我需要将一个大表加入到表的某个转换中。
我用一张大桌子和一张较小的价格表做了一个例子。
输入表格 CarPrices,其中包含每个汽车品牌/型号的价格以及开始和结束日期。我想将所有售出的汽车加入 CarPrices 表中的销售价格,在 PriceStartingDate 和 PriceEndingDate 之间的标准 SaleDate 上,但如果该期间没有价格,我想加入找到的最新价格。
我可以像这样完成它,但它非常慢:
WITH CarPricesTransformation AS (
SELECT CarBrand, CarModel, PriceStartingDate,
CASE WHEN row_number() OVER (PARTITION BY CarBrand, CarModel,
ORDER BY PriceStartingDate DESC) = 1
THEN NULL ELSE PriceEndingDate END PriceEndingDate,
Price
FROM CarPrices
)
SELECT SUM(Price)
FROM LargeCarDataBase C
INNER JOIN CarPricesTransformation P
ON C.CarBrand = P.CarBrand
AND C.CarModel = P.CarModel
AND C.SaleDate >= P.PriceStartingDate
AND (C.SaleDate <= P.PriceEndingDate OR P.PriceEndingDate IS NULL)
一种更快的可靠方法是忘记创建 VIEW 并创建存储过程,我首先将较小的价格表准备为具有正确聚集索引的临时表,然后对其进行连接。这要快得多。但我想坚持一个观点。
有什么想法吗...?