大きなテーブルをテーブルの特定の変換に結合する必要がある、このような状況に頻繁に遭遇します。
大きなテーブルと小さな価格テーブルの例を作成しました。
テーブル CarPrices を入力します。これには、自動車のブランド/モデルごとの価格と、開始日および終了日が含まれています。PriceStartingDate と PriceEndingDate の間の基準 SaleDate で、すべての販売車を CarPrices テーブルの販売価格に結合したいのですが、その期間の価格がない場合は、見つかった最新の価格に結合したいと考えています。
私はこのようにそれを達成することができますが、それは非常に遅いです:
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 を作成して代わりにストアド プロシージャを作成することを忘れることです。最初に、正しいクラスター化インデックスを使用して小さな価格テーブルを一時テーブルとして準備し、次にそれに結合します。これははるかに高速です。しかし、私はビューに固執したいと思います。
何かご意見は...?