sas:数据步骤与proc sql

时间:2014-10-21 14:50:05

标签: sql sas

所以我开始熟悉sas,并且我意识到我学习使用数据集进行的大量操作也可以使用 proc sql语句完成,包括合并,创建变量,子集和许多其他。

我的问题是:“什么时候最好做什么?”,proc sql更好吗?永远?哪个是最快的,哪个内存消耗更少?

请注意,我可能预期答案是“它取决于”,在这种情况下我想知道什么。

3 个答案:

答案 0 :(得分:4)

如果您采取措施:

data temp_new;
set temp;
run;

proc sql;
create table temp_new as
select *
from temp;
quit;

你会发现没有区别。但是有很多。我将仅介绍功能功能,使用数据步骤可以执行的操作以及使用proc sql可以执行的操作。

数据步骤可以:

  • 使用循环;
  • infile from file。
  • 使用open,fetch,fetchobs语句循环访问数据。
  • 使用putLog / put输出到log / file;
  • 使用first,last,retain语句控制数据流。 _n__error_和其他变量。
  • 输出到单个dataStep中的不同表。
  • 输出语句控制向数据集添加的记录数。
  • 在datastep中使用哈希。
  • 使用数组
  • 强制停止阅读
  • 合并/设置时,除内存外,输入数据集的数量没有限制。 (在SQL中的SAS 9.1中:一次可以连接的最大表数为32.我不知道以后的SAS版本是否已更改)
  • 基本上复杂的业务逻辑更容易与数据步骤处理相结合。

Proc sql可以:

  • 使用分组和订购;
  • 使用内部sql。
  • 设置操作(union / outer union / intersect / except)。
  • 执行内部/外部联接而不对数据进行排序。
  • 对插入/删除/更新操作使用完整性约束。 (我没有介绍修改/更新语句的数据步骤。)
  • 直接访问DBMS。

另一个很大的区别是数据步骤和proc sql如何与数据集一起使用 数据步骤按顺序读取记录到程序数据向量,然后对其进行一些处理并将其输出到数据集。 http://support.sas.com/documentation/cdl/en/basess/58133/HTML/default/viewer.htm#a001290590.htm

虽然proc sql将所有内容放入内存或实用程序文件(如果内存不足),并且在内存中进行所有计算和连接。之后,它将所有数据写入数据集。

我基本上都使用它们。 Proc sql在执行某些操作时很有效,这需要插入,更新或删除一小部分数据。例如,您想要将一条记录添加到具有1KK记录的数据集中。在那种情况下你不会使用数据步骤(你可以使用proc附加替代)
如果我需要很多与大表的连接,我更喜欢使用数据步合并/ proc排序组合或其他技术(比如将一个数据集放入数组,使用散列或使用格式),因为它不会那么痛苦。 / p>

答案 1 :(得分:1)

  

proc sql更好吗?

不 - 只是不同。

  

哪个最快?

两者都没有 - 通过SQL执行相同的步骤通常需要与通过datastep执行相同的时间。通过将典型数据步骤更改为典型的SQL查询,您不太可能看到明显的速度差异。

  

哪个内存消耗较少?

他们可能大致相同,为了确定,请使用option fullstimer;,它会在日志窗口中为您提供与以下内容类似的注释:

NOTE: PROCEDURE SQL used (Total process time):
      real time           10.69 seconds
      user cpu time       1.62 seconds
      system cpu time     0.06 seconds
      memory              958.25k
      OS Memory           16328.00k
      Timestamp           10/21/2014 08:35:26 AM
  

什么时候最好做什么?

使用使代码最易被其他人阅读并且可维护的方法。

我能想到的一件事我几乎总是使用proc sql,因为我需要使用不同的连接条件为每个数据集合并(即连接)多个数据集。数据步骤不能简单地在一个步骤中完成此操作,而在proc sql中则非常简单。

答案 2 :(得分:0)

取决于!

关于你想要实现的目标。在不知道你想要实现什么的情况下,这个问题无法回答。请记住,SAS语言已经发展了数十年.SAS努力确保向后兼容性#39;因此有许多东西可用于遗留目的。

例如,当出现新内容(如SQL)时,SAS不会停止支持基于数据步骤运行程序的客户。

SAS语言与SQL语法分开存在,并且再次与其他语言(例如DS2,C ++或JAVA)分开,所有这些语言都可以嵌入SAS中,并且可以执行许多相同的操作。