在SQL Server上删除SAS数据集的特定行的有效方法

时间:2014-10-21 04:04:02

标签: sql-server sas delete-row sql-delete

我想从数据集中删除最新的30天记录。然后我有几种方法可以这样做。

proc sql;
delete from server.data
where Date >= today() - 30;
quit;

OR

data server.data;
set server.data(where= (Date>= today() - 30));
run;

哪种方式更好?或者任何更快的程序?

2 个答案:

答案 0 :(得分:2)

第一种方法更快。

然而,这种方法将删除的观察结果留在原地(它们被标记为已删除)。这会导致表的NOBS和NLOBS属性之间的差异。因此,如果考虑空间,我建议采用第二种方法(以相同的方式使用宏变量常量)。这将重建没有这些记录的表。请记住重新创建任何索引和约束,这些索引和约束将在重建过程中销毁。

编辑:我之前曾建议下面会更快,但事实证明就是这样 - 请参阅Joe在帖子中的评论..

proc sql;
delete from server.data
where Date >= %eval(%sysfunc(today()) - 30);

答案 1 :(得分:1)

我同意RawFocus,但我是否也建议你看看这篇论文?它设置了一个宏,您可以使用它来比较任何两个sas步骤的效率,包括多个指标和特定环境。例如,正如RawFocus指出的那样,如果考虑驱动器,你可能需要一种在I / O上表现更好的技术,这个宏可以让你比较它。当我问自己哪种方式最快/最有效时,我一直在使用这个版本:

http://www.lexjansen.com/nesug/nesug10/ma/ma09.pdf

此致 瓦西里