私は順序付けやフィルタリングに使用する計算列を持っていますが、1000以上の行がある場合は実行に時間がかかります。計算された列の順序またはフィルタリングが遅すぎる
このクエリは、価格に応じて利用可能な日付を注文する予約システム用です。
AvailableDates has one DateGroup
DateGroup has many Prices
DateGroup has many Discounts
Each Discount contains 3 columns. MinPerson, MaxPerson, DiscountPercentage
AvailableDates has many BookingGroups.
BookingGroups has many Bookings.
BookingGroups has a computed column that calculates how many bookings there are.
AvailableDateの価格のための計算列は、関数によって計算される:ここで
は、データベース・スキーマです。価格はで決定されます。ここで
Get Max Price from Prices
Get How many booking there is
Get discount that will be applied depending on number of bookings.
は、関数のクエリです:キー参照(クラスタ)[AvailableDate] [PK_AvailableDate]
マイアクティビティモニタ:。
FUNCTION [dbo].[fn_datePrice]
(
@id INT,
@groupId INT
)
RETURNS decimal(19, 5)
AS
BEGIN
declare @price decimal(19,5), @discount decimal(19,5), @numOfPeople INT
SELECT @numOfPeople= b.NumberOfPeople FROM BookingGroup b
WHERE b.DateId = @id and b.Status != 'Expired';
if (@numOfPeople is null or @numOfPeople < 1)
SET @numOfPeople = 1;
SELECT @price = MAX(pr.Price),
@discount = disc.DiscountPercentage
FROM DateGroup dateGroup
LEFT JOIN Prices pr on pr.GroupId = dateGroup.Id
LEFT JOIN Discounts disc on disc.GroupId = dateGroup.Id and @numOfPeople BETWEEN disc.MinPeople and disc.MaxPeople
WHERE dateGroup.Id = @groupId
GROUP BY dateGroup.Id, disc.DiscountPercentage;
if (@discount is null)
return @price
return @price * (100 - @discount)/100
END;
GO
実行計画は、コストの78%が上であると言いますこのクエリは最も高価なものです:
SELECT @price = MAX(pr.Price),
@discount = disc.DiscountPercentage
FROM DateGroup dateGroup
LEFT JOIN Prices pr on pr.GroupId = dateGroup.Id
LEFT JOIN Discounts disc on disc.GroupId = dateGroup.Id and @numOfPeople BETWEEN disc.MinPeople and disc.MaxPeople
WHERE dateGroup.Id = @groupId
GROUP BY dateGroup.Id, disc.DiscountPercentage;
実行計画には、キーの参照(クラスタ化)[日付]。[PK_Date] 'xmlとして実行計画を共有してください – TheGameiswar
[日付]とは何ですか?私は[日付]は表示されません。私は[DateGroup]が表示されます。 –
スカラー関数をテーブル値関数にオプションで指定していますか?一般的に、TVF(インラインTVFが好ましい)はスカラーの方が速い。 – Serg