【发布时间】:2014-12-12 01:14:51
【问题描述】:
10 月 21 日编辑
背景
存储在基于 MS-SQL 的服务器上的原始数据集(每天更改):Sourcelib.RAW 和一个LOCAL excel 文件(保留为unchanged)。
我需要刷新位于Targerlib 中的数据集WANT。目前我有 SQL 代码在 2-3 分钟内执行这样的任务。但我想知道 SAS 是否可以在处理时间不会增加太多的情况下做同样的事情。
-
work.IMP大约有 6M 条记录,每条记录大约 50 字节。 - 理想的方法应该是非常有效的,因为随着时间的推移,服务器上的原始数据集的大小会非常庞大。
- 一次性建立目标文件
CANNOT,然后每天向其添加新数据。因为以前的数据可能(甚至非常不可能)发生变化。
根据@Joe,我应该允许更新目标文件,使用proc compare 或data step 中的update。这是我发布的一个相关问题How to use proc compare to update dataset
- 服务器上还有10GB以上的可用空间,足够了。我电脑的可用内存约为 3.5GB(不确定是否重要)
- 由于服务器的体系结构,在 MS-SQL 中执行此操作非常有效。但我真的很想知道 SAS 是否可以处理这个问题(当服务器不是这样时
"compatible")
流程
- 首先我从excel文件中导入数据,然后
subset&tranpose它是work.IMP。由于某些原因,此文件每天只能以这种方式创建。它CANNOT存储在服务器中。 - 然后对
work.IMP和一个原始数据集Sourcelib.RAW1执行外连接,得到work.HAVE1。请注意,work.IMP已排序,但Sourcelib.RAW1未排序。外连接仅用于(根据某些条件)确定每条数据记录。
i.e. case when a.COL1 is '' then b.COL1 else a.COL1 end as COL1
你可以认为这个过程是通过使用work.IMP来调整Sourcelib.RAW1。
PS1:@sparc_spread 建议直接向服务器执行导入过程。但它不会比在LOCAL 中这样做有任何好处。 hash object 也无济于事。
- 然后我将另一个原始数据集
Sourcelib.RAW2子集化为work.temp,然后将sort子集化为work.HAVE2。 (Sourcelib.RAW2中的数据大多是乱序的。) - 我使用
proc append(因为两个表都很大)将work.HAVE1、work.HAVE2连接成work.HAVE
PS2:step3中的排序是为了避免在step4的末尾排序。实际上数据Targerlib.WANT 不必按顺序排列。但最好是这样。
- 最后,我将
work.HAVE复制到服务器Targetlib.HAVE。
我在WORK 中完成了大部分工作,只花了我几分钟。但是step5 可能需要我半个小时才能完成副本。
根据@Joe,这可能主要是由于与网络传输相关的原因。 I.E最小化网络传输
问题
有什么方法可以改善step5?或者对整个过程进行任何修改都会提高性能?
【问题讨论】:
-
A) 看起来您从
work.IMP开始,然后将其拆分为两个数据集,然后将它们重新连接为一个。如果有某种方法可以避免这种情况,那就太好了 - 你能告诉我更多关于你在步骤 2 中所做的操作 B)你是在 Windows 还是 Linux 上运行?库的硬件情况如何(它们是否位于单独的磁盘上,这些磁盘是否属于某种 RAID,您的实用程序库 (UTILLOC) 的设置是什么等)? -
如果要跨服务器移动批量加载选项,您是否考虑过?
-
这两个系统是同一个架构吗? IE两个Windows?
-
@sparc_spread 并没有真正将其一分为二。我已经用更多的操作细节编辑了我的问题。
-
@Reese 我使用了默认设置。我该如何优化呢?
标签: sql-server sas processing-efficiency memory-efficient