我有一个包含许多UDF的数据库,其中包含一个长期运行的过程,涉及许多数据操作和计算。
我在使用UDF时的想法是将信息的逻辑单元从基础表中分离出来。例如,如果我试图获取有关汽车的信息,则可能会有多个表格,例如颜色,型号,年份等,我必须每次都要加入以获得汽车的表格。取而代之的是,我将拥有一个类似于fnCar()的函数来获取数据的非规范化视图。
在长时间运行的过程中,我经常调用这些函数,我想知道,如果我有一个非规范化的工作表,视图或临时表来进行数据处理和计算是否会更好呢?在性能方面,通常应该注意使用UDF的一些缺点吗?
例如,我使用UDF进行一些计算。然后,我取消显示该数据并将其存储在表中。每当我需要再次使用该数据时,我都会调用UDF来回移数据。我们这样做的原因是保持我们的计算灵活。如果我们添加/删除/更改计算,我们不想更改数据模型。
--Calculate some values in a function declare @location table ( id int, lattitude float, longitude float ) insert into @location select 1, 40.7, 74 insert into @location select 2, 42, 73 insert into @location select 3, 61, 149 insert into @location select 4, 41, 87 declare @myLattitude float declare @myLongitude float set @myLattitude =43 set @myLongitude = 116 declare @distance table ( id int, distance float ) insert into @distance select id, sqrt(power(lattitude-@mylattitude,2)+power(longitude-@mylongitude,2)) from @location --Store unpivoted data in a table declare @unpivot table ( id int, attribute varchar(100), 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 ) a unpivot ( attributeValue for attribute in (lattitude, longitude, distance) ) x --retrive data from store via pivoting function for reporting select * from @unpivot pivot ( max(attributeValue) for Attribute in (lattitude, longitude, distance) ) x
我会尝试一个答案
简单: 您使用UDF做错了
使用UDF时,您会添加以下问题
RBAR(请参阅底部)处理 当在SELECT子句中使用具有表访问权限的标量UDF时, 即,强制表lookip为“每行”,而不是有效的JOIN。
具有多语句 TVF的黑匣子处理每个TVF都必须运行完毕,并被视为“黑匣子”
通常 ,您要做的是先加载一个平面暂存表,然后再将JOIN加载到查找表中,然后按一组进行处理。如果这是“非正规化”的意思,那么可以,它可能会更好。
将UDF用于“信息的逻辑单位”是面向对象/过程思维。SQL是基于集合的。对于通过本机/ CLR代码运行的对象或对象集合,似乎 没有问题 , 无法 通过查询优化器进行基于集合的数据处理。
注意:RBAR =通过使行变斜行。有关更多信息,请参见Simple Talk的文章。