dimanche 19 juin 2016

Using temp table in table-valued function. Query optimization

I created new table-valued function, and then realized that the approach may not be very good. The main problem (in my opinion) is that I used declaration new table in tvf. I'm sure that this is not very good for 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 (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

What can I do to optimize this function?

Aucun commentaire:

Enregistrer un commentaire