导航

Function在View中慎用

Posted on 2011-09-21 08:20  clare-zhang  阅读(655)  评论(0)    收藏  举报

1 用户自定义函数的确给我们带来了很多方便。使代码更简洁和易读。

2 自定义函数用户视图,使 View 的书写更简单。

3 但是,如果用户自定义函数是通过检索表而得到返回值的情况时,千万就不要使用到视图中了。

原因:对视图进行查询的时候,SQLServer 的机制是,每查询到一行数据,都重新执行这个用户自定义函数,即要去多某表进行检索而得出结果。

如果视图的主题表有 1000 行,而函数里面检索的表有 1000 行,那么函数总共要执行 1000 * 1000 次检索任务。特别是检索的字段没有建立索引时,将会是“崩溃”性的结果。

V_UserDetails:

select F_GetUserName(ID), * from T_Users

F_GetUserName(@ID int)

{

      declare @Name varchar(50)

      select @Name = [Name] from T_OldUsers where [ID] = @ID

      return @Name

}

   以上函数和视图,在有 100000 条记录时,将执行 100000 * 100000 次检索。

4 解决以上(3) 的办法是:先将 Name 字段通过级联查询出中间表,再将中间表与视图的主题标进行级联。

5 如果用户自定义函数中没有使用检索表,而只是计算:

    F_GetResult(@a int, @b int)

    {

        return @a * @b;

    }

    那么就另当别论了。随意使用