回答

收藏

用户定义的功能性能劣势

技术问答 技术问答 280 人阅读 | 0 人回复 | 2023-09-12

我有一个包含很多UDF该数据库包含一个涉及大量数据操作和计算的长期运行过程。7 c* S7 A" X6 o1 Q: S+ i" ?
我在使用UDF当时的想法是将信息的逻辑单元从基本表中分离出来。例如,如果我试图获取关于汽车的信息,可能会有多个表格,如颜色、型号、年份等。我必须每次都加入以获得汽车的表格。相反,我会有一个类似的fnCar()的函数来获取数据的非规范化视图。# w1 i3 s! J$ v* q5 w
在长时间运行的过程中,我经常调用这些函数。我想知道,如果我有一个非标准化的工作表、视图或临时表来处理和计算数据会更好吗?在性能方面,通常应注意使用UDF有缺点吗?
+ q% T2 T/ g- ?8 g/ n例如,我用它UDF做一些计算。然后,我取消显示数据并将其存储在表中。每当我需要再次使用数据时,我都会调用它UDF来回移动数据。我们这样做的原因是为了保持我们的计算灵活。如果我们添加/删除/更改计算,我们不想更改数据模型。) Q! S. u+ n$ _7 \
--Calculate some values in a functiondeclare @location table(    id int,   lattitude float,   longitude float)insert into @location select  1,40.7,74insert into @location select  2,42,73insert into @location select  3,61,149insert into @location select  4,41,87declare @myLattitude floatdeclare @myLongitude floatset @myLattitude =43set @myLongitude = 116declare @distance table(    id int,   distance float)insert into @distanceselect id,sqrt(power(lattitude-@mylattitude,2) power(longitude-@mylongitude,2))from @location--Store unpivoted data in a tabledeclare @unpivot table(    id int,   attribute varchar   attributeValue float)insert into @unpivot(    id,   attribute,   attributeValue)select id    ,attribute    ,attributevalue from(    select         L.id,       L.Lattitude,        L.Longitude,       D.Distance    from @location L         inner join @distance D         on L.id=D.id) aunpivot  attributeValue for attribute in    (lattitude,longitude,distance)) x--retrive data from store via pivoting function for reportingselect * from @unpivotpivot  max(attributeValue) for Attribute in (lattitude,longitude,distance)) x                ! G3 ~' d: u& W6 {1 w! l) }
    解决方案:                                                               
5 }) }6 g( y9 h* N" o                                                                我会尝试一个答案* i+ M# ^) p& {5 A- |2 t
简单: 您使用UDF做错了0 _+ A0 j( O9 o! h- B- l4 d) x
使用UDF当您添加以下问题时,您将添加以下问题' F# @- L) q) X$ Q6 W
[ol]RBAR(请参阅底部)处理
- ^/ w1 q$ E8 M当在SELECT在句子中使用具有表访问权限的标量UDF时,
3 M1 J8 D5 Z8 ?2 V/ @即,强制表lookip对于每一行不是有效JOIN。具有多语句' O' c! a6 S. P& Z: g4 R: A8 ~
TVF处理每个黑匣子TVF必须完成,并被视为黑匣子
+ w5 T6 W- w7 X[/ol]通常    ,你要做的是先加载一个平面临时存储表,然后再加载JOIN将其加载到搜索表中,然后按一组进行处理。假如这意味着非正规化,那么它可能会更好。$ o7 G# O3 Y, V4 ^! K! H' ]* H
将UDF用于信息的逻辑单位是面向对象/过程思维。SQL基于集合。通过本机/ CLR似乎 没有问题    ,
. M( [# l4 B3 J$ B0 D$ a无法    基于集合的数据处理是通过查询优化器进行的。* P3 K3 G3 K* ]# J* G& g5 d  j
注意:RBAR =通过使行变斜行。有关更多信息,请参见Simple Talk的文章。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则