内联函数替换标量函数

时间:2015-07-22 13:21:25

标签: sql-server query-optimization user-defined-functions

我有一个当前使用标量函数的proc,在select语句中两次,如下所述。当我们处理数百万条记录时,用内联函数替换它会更好。但是应该是什么呢?

CREATE FUNCTION getcategory
(
    @shopping_store CHAR(4),
    @cart_type      CHAR(2),
    @category_type  INT,
    @index_cat_type INT
)
RETURNS INT
BEGIN
    IF @shopping_store IN ('1111','1222','3222') AND @cart_type in ('120')
        RETURN -@category_type
    ELSE IF @shopping_store IN ('4333','54322') AND @cart_type IN ('120')
        RETURN @index_cat_type
    ELSE
    BEGIN
        IF @shopping_store IN ('32214','5432','5654')
            RETURN @category_type
        ELSE
            RETURN -@index_cat_type
    END

    RETURN @category_type
END

1 个答案:

答案 0 :(得分:1)

所有这些IF ELSE都可以转换为单个案例表达式。然后,您可以将此标量函数转换为内联表值函数。当您声明有数百万行时,这应该是相当大的性能优势。我也冒昧地将@cart_type改为char(4),因为GarethD指出它甚至不能包含' 120'。当我想要一个负数时,我也使用了显式乘法,因为它太容易错过了 - 在开始时,当你乘以负数1时非常清楚。

CREATE FUNCTION getcategory
(
    @shopping_store CHAR(4),
    @cart_type      CHAR(4),
    @category_type  INT,
    @index_cat_type INT
)
RETURNS TABLE as RETURN
    select case 
        when @shopping_store IN ('1111','1222','3222') AND @cart_type in ('120') 
            then -1 * @category_type
        when @shopping_store IN ('4333','54322') AND @cart_type IN ('120')
            then @index_cat_type
        when @shopping_store IN ('32214','5432','5654')
            then @category_type
        ELSE
            -1 * @index_cat_type
    END as CategoryType