Function与View

CREATE FUNCTION [dbo].[GetProductDBCityCode](@PkgDBCityId int)
    returns char(3)
as
BEGIN
 DECLARE @str as char(3);
 
 SELECT @str=MIN(C.CityCode) FROM City A
 INNER JOIN Country B ON B.Country=A.Country 
 INNER JOIN Area_City C ON C.CnName=A.CityName
 INNER JOIN Area_Country D ON D.CountryId=C.CountryId AND D.CnName=B.CountryName
 WHERE A.City=@PkgDBCityId;
 
 return @str
END

 

 

SELECT A.*, dbo.GetProductDBCityCode(A.startCity) AS startCityCode, dbo.GetProductDBCityCode(A.destCity) AS destCityCode, E.isFlight FROM pkgT3Segment A
 INNER JOIN Pkg B ON A.Pkg=B.Pkg
 LEFT JOIN pkgT3Choice E ON A.Pkg=E.Pkg AND A.segment=E.segment

 

Function相当于在foreach中执行,所以慢,可以考虑优为了一个中间存领View

 

===========================================
SELECT A.*, C.CityCode AS startCityCode, D.CityCode AS destCityCode, E.isFlight FROM pkgT3Segment A
 INNER JOIN Pkg B ON A.Pkg=B.Pkg
 LEFT JOIN VCityCode C ON A.startCity=C.CityId
 LEFT JOIN VCityCode D ON A.destCity=D.CityId             
 LEFT JOIN pkgT3Choice E ON A.Pkg=E.Pkg AND A.segment=E.segment

 

view查询出来后,就相当于一个表,只计算一次

 

========================

http://www.cnblogs.com/clare-zhang/archive/2011/09/21/2183045.html

Function在View中慎用

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;

    }

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

 

其它相关做法:


http://www.cnblogs.com/clare-zhang/archive/2011/09/21/2183045.html 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值