часто я сталкиваюсь с такой ситуацией, когда мне нужно присоединить большую таблицу к определенному преобразованию таблицы.
Я привел пример с большой таблицей и таблицей меньших цен.
Введите таблицу CarPrices, в которой указаны цены по марке / модели автомобиля с датами начала и окончания.Я хочу объединить все проданные автомобили с продажной ценой в таблице CarPrices, по критерию SaleDate BETWEEN PriceStartingDate и PriceEndingDate, но если цены за период отсутствуют, я хочу присоединиться к самой новой найденной цене.
Я могу сделать это так, но это ужасно медленно:
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 и создании хранимой процедуры вместо этого, где я сначала готовлюменьшую таблицу цен в качестве временной таблицы с правильным кластерным индексом, а затем сделайте соединение с этим.Это намного быстрее.Но я бы хотел придерживаться мнения.
Есть мысли ...?