一尘不染

用户定义的功能性能劣势

sql

我有一个包含许多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

阅读 156

收藏
2021-05-30

共1个答案

一尘不染

我会尝试一个答案

简单: 您使用UDF做错了

使用UDF时,您会添加以下问题

  1. RBAR(请参阅底部)处理
    当在SELECT子句中使用具有表访问权限的标量UDF时,
    即,强制表lookip为“每行”,而不是有效的JOIN。

  2. 具有多语句
    TVF的黑匣子处理每个TVF都必须运行完毕,并被视为“黑匣子”

通常 ,您要做的是先加载一个平面暂存表,然后再将JOIN加载到查找表中,然后按一组进行处理。如果这是“非正规化”的意思,那么可以,它可能会更好。

将UDF用于“信息的逻辑单位”是面向对象/过程思维。SQL是基于集合的。对于通过本机/ CLR代码运行的对象或对象集合,似乎 没有问题
无法 通过查询优化器进行基于集合的数据处理。

注意:RBAR =通过使行变斜行。有关更多信息,请参见Simple Talk的文章。

2021-05-30