0

我需要启动和运行 SAS DI 作业时遇到巨大的性能问题。因此,我正在寻找优化工作的聪明方法。

我特别想到的一件事是,我或许应该改变一些连接和附加的顺序。目前,我的工作配置如下:

有几个类似结构的源表,我首先将日期过滤器应用于(以减少行数)并对两个字段进行排序,例如ab,然后我将每个表连接到具有相同字段的帐户表的表ab(如果可能的话,我想为这些创建索引,但不知道如何为 SAS DI 中的临时工作表创建索引)。在每个连接完成后,我将结果表附加到一个数据集中。

我突然想到我可以先追加,然后只做一个连接,但我不知道哪种方法更快,或者如果答案是它取决于我不知道它取决于什么(尽管我会猜测组成表的大小)。

那么,执行多个连接然后追加,还是追加然后执行一个连接更好?

编辑

这是一些相关信息的更新(由用户Robert Penridge请求)。

  • 这里的源表数量为 7 个,这些表的大小在 1500 到 520 万之间。10 000 是典型的。列数为 25。这些表都与同一个表连接,该表大约有 5000 行和 8 列。
  • 我估计唯一键将表划分为大小大致相等的子集;这里的大小减少应该在 8% 和 30% 之间(差异是由于一些源表比其他源表携带更多的历史数据,增加了分组到相同数量组的表的百分比)。
  • 我已将列数限制为所需的最小数量(21)。
  • 默认情况下,SAS DI 将所有临时数据集创建为视图,我没有更改它。
  • 附加和连接的代码由 SAS DI 在使用 GUI 元素构建它们后自动生成。
  • 最终数据集未排序;我对馈送连接的数据进行排序的原因是该链接关于连接性能的部分(第 35 页)提到它应该提高性能。
  • 正如我所提到的,我不确定是否可以将索引放在 SAS DI 中的临时工作表或视图上。
  • 我不能说这些字段的宽度是否大于绝对必要的,但如果是这样,我怀疑它是令人震惊的。我犹豫要不要更改它,因为它必须在多个表上手动完成,并且当新数据进入时,它可能需要额外的列宽。

非常感谢

4

2 回答 2

0

根据您的评论,似乎
1. 有 7 个输入源表
2. 将这 7 个源表连接到 1 个表
3. 附加结果

在 SAS DI studio 中,使用 Lookup 更快地执行上述操作
1. 将 7 个输入表连接到 Lookup Transform(我们称它们为 SRC 1-7) 2. 包含 5000 条记录的表是在其上执行查找的表键 A 和 B(我们称之为 LKUP-1) 3. 将 LKUP-1 中的相关列传播到 TARGET 表中。

这会快得多,并且在这种情况下您不必执行 JOIN,因为我怀疑您正在执行多对多联接,这会降低 SAS DIS 的性能。

于 2015-10-26T23:51:42.060 回答
0

SAS 中的性能主要是关于减少 IO(即读/写磁盘)。

如果没有其他详细信息,很难提供帮助,但您可以考虑的其他一些事情是:

  • 使用 keep 语句限制您正在处理的列(减少 IO)
  • 如果执行连接的步骤是 IO 密集型的,请考虑使用视图而不是创建临时表
  • 如果连接仍然很耗时,请考虑用哈希表查找替换它们
  • 确保您使用proc append将 2 个数据集附加在一起以减少 IO。将较小的数据集附加到较大的数据集。
  • 考虑不对最终数据集进行排序,而是在其上为数据的消费者放置一个索引。
  • 确保您使用某种类型的数据集压缩,或确保为所有列正确设置列宽(即,在使用宽度为 8 的字段上,您没有 200 的宽度)
  • 尽可能早地减少行数(您已经这样做了,只是为了完整起见在这里列出)

调整左连接和附加的顺序可能不会像上面那样有太大的不同。

于 2015-08-21T14:34:50.123 回答