用户定义函数性能缺点

2024-07-03

我有一个包含大量 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

我会尝试回答

Simply: 你对 UDF 的做法是错误的

当你使用UDF时,你就会添加这些问题

  1. RBAR(见底部)处理
    当您在 SELECT 子句中使用带有表访问的标量 UDF 时
    也就是说,您不是执行高效的 JOIN,而是强制执行表查找*每行”

  2. 使用多语句 TVF 进行黑盒处理
    每个 TVF 都必须运行完成,被视为“黑匣子”

你什么normally要做的就是加载一个平面暂存表,然后加入到查找表中,处理是作为一个集合完成的。如果这就是您所说的“非规范化”的意思,那么是的,它可能效果更好。

使用 UDF 表示“信息的逻辑单元”是 OO/过程思维。 SQL 是基于设置的。对于在本机/CLR 代码中运行的对象或对象集合来说,什么看起来正常fails通过查询优化器进行基于集合的数据处理。

注:RBAR = 逐行排列。有关更多信息,请参阅简单说说的文章 http://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户定义函数性能缺点 的相关文章

  • SQL Loader 脚本帮助添加 SYSDATE、USER

    我正在尝试从文件加载数据 并且想将 CREATED DATE 和 UPDATED DATE 设置为 SYSDATE 将 CREATE BY 和 UPDATED BY 设置为 USER 这是我正在使用的表 CREATE TABLE CATAL
  • 我可以在商业应用程序中使用免费的 SQL Server Express [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 SQL SERVER 中格式化日期时间

    我正在尝试移植MySQL功能DATE FORMAT date y m d h i s p 与 MsSQL 等效 使用CONVERT 如何在 SQL SERVER 2012 中格式化等效的日期时间字符串以提供此输出 2014 05 24 01
  • 如果条件不匹配,select 语句返回什么?

    例如 如果我有以下声明 declare uid int set uid select id from tablename where condition 在这种情况下 如果 select 没有返回结果 那么 uid be 简而言之 它将为空
  • 提高C代码的性能

    提高C代码性能的最非正统的方法是什么 这是没有任何限制的 一切都会进行 包括将循环结构更改为 goto 对所有内容进行硬编码 以奇怪的方式使用 case 语句等 完全不用担心可维护性 可读性等 附注这is实用 而且我很清楚如何以合理的方式提
  • 是否有一个表保存 sysobjects.xtype 描述的列表?

    根据sysobjects 文档 https msdn microsoft com en us library ms177596 aspx sysobjects xtype可以是以下对象类型之一 xtype Description AF Ag
  • PHP SQLSRV:sqlsrv_query() 是否可以正确地准备 select 语句?

    TL DR Does sqlsrv query 做同样的工作select陈述比sqlsrv prepare and sqlsrv execute 关于准备好的陈述 做什么 我怎样才能做一个安全的select陈述 一点历史 我是 PHP 开发
  • jqGrid - 未应用日期和时间格式

    我有一个显示 3 列的 jqGrid 其中一列是日期时间 正在返回的 SQL 日期时间字段 colModel 设置如下 colModel name col1 sortable false name col2 sortable false n
  • 事务内存需要什么才能可行?

    我一直在研究事务内存及其对系统编程 数据库 操作系统 服务器等 的可行性 我自己使用事务的经验 以及看到很少有社区在实际代码中使用事务 提出了一个问题 什么会说服你 一个编写生产代码的开发人员 在你的工作中使用事务内存 会被普遍采用吗 高速
  • 使用 FOR XML 从 SQL Server 2008 R2 返回空或 null 字段作为

    我正在使用 SQL Server 2008 R2 运行查询FOR XML PATH 我唯一的问题是我希望所有元素都出现 即使它们是 NULL 并且我希望空 或 null 元素返回为
  • 如何清除实体框架中的待定更改

    我有一些表数据DbContext我不想保存 我已经删除了数据库 重新设置了它 但是挂起的更改不会消失DbContext 重建数据库后 我的数据库表为空 但是当我将实体作为对象列表调用时 它仍然包含旧对象 关于如何清除旧的待处理数据有什么建议
  • SQL Server 更改数据捕获 - 捕获进行更改的用户

    关于SQL Server 更改数据捕获 https msdn microsoft com en us library bb933994 v sql 120 aspx 你能追踪到User谁对行 列数据进行了更改 或者是否有办法扩展 CDC 以
  • 使用两列的 T-SQL“不在其中”

    我想从表 T1 中选择所有记录 其中 A 列和 B 列中的值与表 T2 中的 C 列和 D 列没有匹配的元组 In mysql Where not in 使用两列 https stackoverflow com questions 8435
  • 对多个表进行排序 MYSQL DateStamp

    我正在构建一个简单的买卖网站 并希望在第一页上列出最新的广告 在我的数据库中有 4 个表 USERS CARS ELECTRONICS and COMPUTERS 三个项目表中的每一个 CARS ELECTRONICS and COMPUT
  • 如何打印导致ORA-01843错误的记录?

    我有一个包含数百万条记录的表 我正在尝试将一列数据格式化为DATE格式 目前处于VARCHAR2 但是 我越来越ORA 01843不是有效的月份错误 我正在尝试获取导致 ORA 01843 的那些记录 CREATE OR REPLACE P
  • PostgreSQL 使用“lag()”窗口函数更新查询

    我有一个涉及Postgresql数据库的任务 我对 SQL 不太有经验 我有一张贸易产品每周营业额的表格 每周提供以下信息 产品 周数 周营业额 可能是正值或负值 具体取决于天气 更多产品被购买或出售 我添加了一栏 其中包含每周的期末余额
  • CLASSPATH 中存在未使用的 JAR 文件的影响

    我在这里阅读了很多有关可用工具的问答unusedJAR 例如 loosejar http code google com p loosejar 类路径助手 http classpathhelper sourceforge net 我的问题是
  • IF 语句中间的 GO 命令

    我正在寻找有关创建表的信息 仅当它们在当前数据库中不存在时 以便能够在可能或可能没有它们的不同数据库中创建它 并发现这两个有用的主题 SQL Server 检查表是否存在 https stackoverflow com questions
  • 如何调节日志指令随时间产生的打印输出量?

    如何将程序日志打印输出限制为 Y 秒内最多 X 个打印输出 使用 java util logging 进行服务器端编程 我的代码有很多信息 警告和错误语句 例如 s logger logp Level WARNING myClassName
  • JS:在调用文件中的每个其他函数之前调用某个函数

    我有一个关于在 JS 中更好地重用代码的问题 例如我有文件functions js具有以下功能 export const a gt export const b gt export const c gt const foo gt 我想在调用

随机推荐