私は新しいテーブル値関数を作成しましたが、そのアプローチがあまり良くないことに気付きました。主な問題(私の意見では)は、tvf
に宣言の新しいテーブルを使用しています。私はこれがtvf
にはあまり良くないと確信しています。テーブル値関数での一時テーブルの使用。クエリの最適化
ALTER FUNCTION [dbo].[tvf_GetOnSaleDate]
(
@EntityType INT
)
RETURNS @Result TABLE(OnSaleDate DATETIME, EntityId INT)
BEGIN
DECLARE @Sales TABLE (SaleDate DATETIME, EntityId INT, SaleDateVenueDate DATE, CurrentVenueDate DATE)
INSERT @Sales (SaleDate, EntityId, SaleDateVenueDate, CurrentVenueDate)
SELECT SaleDate, EntityId, CAST(DATEADD(hour, vc.HoursOffset, SaleDate) AS DATE) AS SaleDateVenueDate, CAST(DATEADD(hour, vc.HoursOffset, GETUTCDATE()) AS DATE) AS CurrentVenueDate
FROM dbo.om_EntityOnSale AS es WITH (NOLOCK)
INNER JOIN dbo.event AS e WITH (NOLOCK) ON e.event_id = es.EntityId AND es.EntityType = @EntityType
INNER JOIN dbo.om_Venue AS vc WITH (NOLOCK) ON vc.Indux_Venue_Id = e.venue_id
INSERT @Result(OnSaleDate, EntityId)
SELECT [OnSaleDate] =
CASE
WHEN (SELECT COUNT([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] = [CurrentVenueDate] AND [EntityId] = sales.EntityId) > 0
THEN ISNULL((SELECT MIN([SaleDate]) FROM @Sales WHERE [SaleDate] > GETUTCDATE() AND [SaleDateVenueDate] = [CurrentVenueDate] AND [EntityId] = sales.EntityId),
(SELECT MAX([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] = [CurrentVenueDate] AND [EntityId] = sales.EntityId))
WHEN (SELECT COUNT([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] > [CurrentVenueDate] AND [EntityId] = sales.EntityId) > 0
THEN (SELECT MIN([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] > [CurrentVenueDate] AND [EntityId] = sales.EntityId)
WHEN (SELECT COUNT([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] < [CurrentVenueDate] AND [EntityId] = sales.EntityId) > 0
THEN (SELECT MAX([SaleDate]) FROM @Sales WHERE [SaleDateVenueDate] < [CurrentVenueDate] AND [EntityId] = sales.EntityId)
END, sales.[EntityId]
FROM @Sales sales
GROUP BY EntityId
RETURN
END
この機能を最適化するにはどうすればよいですか?
このアプローチがあまりよくないと思われる理由を説明すると、役立つでしょう。今あなたの問題が何であるか把握するのに多くの時間がかかります。 – Roland
私はたくさんのSQLを知っていませんが、別の「ビュー」から自分のテレビ番組を呼び出す場合は、「表示」の各行について「挿入」を行うことを意味する を意味します。それは良いとは思わない。 –
@DenisGvozd、TVFではなくCTEを使用できますか? –