繁体   English   中英

连接表值函数的更好方法

[英]Better way to join table valued function

我正在尝试生成一个表,该表在特定时间进行客户年龄分析。 我的源数据来自Pastel Evolution会计系统。

它们具有表值函数[_efnAgedPostARBalancesSum] ,该函数具有2个参数(日期和客户端链接),并为输入的客户端链接返回Age1Age2等。 我需要获取客户表中所有客户的账龄。

我设法通过使用交叉申请,如下所述,但它需要很长时间才能执行。 如果我从Pastel内部运行年龄分析,则大约需要20秒,而在Sql中,大约需要6分钟。

该功能已加密,所以我看不到它的作用。 我正在使用SQL Server 2008 R2。 有没有更有效的替代方法可以交叉应用?

SELECT 
  f.AccountLink, 
  f.AccountBalance, 
  f.Age1, 
  f.Age2, 
  f.Age3, 
  f.Age4, 
  f.Age5, 
  f.Age6, 
  f.Age7 
FROM
  Client 
  CROSS APPLY [_efnAgedPostARBalancesSum] ('2014-09-30', Client.DCLink) AS f

从外部看,它看起来像一个AR老化存储桶功能-可能具有自定义存储桶大小(给定的age1,age2等)。 他们臭名昭著的计算密集型。 这种查询经常导致需要单独的BI数据库,因为OLTP系统对于分析查询而言并不理想。 它不仅运行缓慢,而且在此功能发挥作用时,还可能影响OLTP系统中的其他工作。

您可以打赌,它正在查看包含到期余额(很可能有多个来源)的各种文档的到期日期。 它们可能不会都在到期日期列上建立索引。 首先寻找。 如果在显示计划打开的情况下在SSMS中运行查询,则可能会建议一个或多个索引以加快执行速度-在查询窗口中右键单击并选择“显示实际查询计划”。 由此,您至少可以发现正在接触的表以及收集数据所涉及的谓语...并且使用索引可能会很幸运。

没有人知道该函数计算存储桶的效率如何。 如果他们没有使用某种窗口函数,那可能会很可怕。 您可能会发现编写自己的UDF以仅获得所需的内容是有利的。 由于它是通用的,因此它可能需要做更多的工作来覆盖所有可能的基础-您的组织可能不需要这些。

如果它是一个内联函数,则可能只要求您真正需要查看的列就可以减轻一些负担。 他们返回了(至少)7个存储桶,很多AR报告和分析仅需要3个(例如30、60、90天的存储桶)。 可能还需要进行一些预分析,以了解将功能应用到哪些客户端-避免不得不在整个客户端域上运行该功能。

仅查看函数名称-让我认为它本身不是文档化的API。 加密增强了这种直觉。 不知道您真的想使用这样的功能有多严重-不知道将来如何重构(或删除)它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM