加入表值函数的更好方法

时间:2015-06-05 12:03:29

标签: sql-server

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

他们有一个表值函数Route::group(array('before' => 'csrf'), function(){ Route::post('/coupon/verify',['uses' => 'AccessController@validate', 'as' => 'coupon-verify']); }); ,它接受​​2个参数(日期和客户端链接)并返回[_efnAgedPostARBalancesSum]Age1等输入的客户端链接。我需要为客户端表中的所有客户端进行老化。

我设法通过使用交叉应用来实现它,如下所示,但执行需要很长时间。如果我在Pastel中运行年龄分析大约需要20秒,在Sql中需要大约6分钟。

该功能已加密,因此无法查看其功能。我正在使用SQL Server 2008 R2。 是否有更有效的交叉申请替代方案?

Age2

1 个答案:

答案 0 :(得分:0)

它看起来像是来自外部的AR老化桶功能 - 并且可能具有自定义桶大小(给定通用age1,age2等)。他们众所周知地计算密集型。它经常产生对单独的BI数据库作为OLTP系统的需求的查询类型不适合分析查询。它不仅运行缓慢,而且还可能影响OLTP系统中的其他工作,而这个功能正在敲打它。

您可以打赌,它会查看包含到期余额的各种文件的截止日期(很可能是多个来源)。它们可能不会全部在截止日期列上编入索引。先找那个。如果在启用了show plan的SSMS中运行查询,则可能会建议一个或多个索引来加速执行 - 在查询窗口中单击鼠标右键并选择“显示实际查询计划”#34;。从这里,你至少可以发现被触摸的表格以及收集数据所涉及的谓词......你可能会因为索引而幸运。

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

如果它是内联函数,您可以通过仅询问您真正需要查看的列来获得一些缓解。他们返回(至少)7个桶,并且许多AR报告和分析仅需要3个(例如30,60,90天的桶)。可能还需要进行一些预分析,以找出应用该功能所需的客户端 - 以防止必须针对整个客户端域运行它。

只是查看函数名称 - 让我觉得它本身并不是一个记录的API。加密加强了这种预感。不确定你真的想要使用这样一个函数有多么糟糕 - 不知道它将如何被重构(或删除)。