【问题标题】:Efficient way to delete specific rows of a SAS dataset on a SQL Server在 SQL Server 上删除 SAS 数据集的特定行的有效方法
【发布时间】:2014-10-21 04:04:01
【问题描述】:

我想从数据集中删除最近 30 天的记录。那么我有几种方法可以做到这一点。

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

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

哪种方式更好?还是有更快的程序?

【问题讨论】:

  • delete 花费了我几乎相同的时间来构建一个新表

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


【解决方案1】:

第一种方法更快。

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

编辑:我之前曾建议下面会更快,但事实证明 不是 - 请参阅线程中乔的评论..

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

【讨论】:

  • 原表有10M多条记录。这就是为什么我不想重建整个表。这真的很耗时。
  • 原始表是 SAS 数据集吗?如果您要连接到数据库,请尝试使用直通 SQL。这可能会更快(尽管 libname 引擎应该已酌情解决)
  • @RawFocus 虽然您的论点很有趣,但您实际上并不正确,即 today() 与 %sysfunc(today()) 不同。 SAS 编译器(当它被传递到数据库时类似于 SQL 编译器,它甚至可能使用 libname SQL)足够聪明,可以识别 today() 是一个常量。运行测试;我只使用 1e8 行(~100MM)运行了一个,删除了其中的一半,两个运行相同。
  • 有趣 - 很高兴知道!谢谢@乔!我已经编辑了我的回复。
【解决方案2】:

我同意 RawFocus,但我也可以建议看看这篇论文吗?它列出了一个宏,您可以使用该宏来比较任意两个 sas 步骤在多个指标和特定环境中的效率。例如,正如 RawFocus 所指出的,如果考虑到驱动器,您可能需要一种在 I/O 上执行得更好的技术,并且此宏可让您进行比较。当我问自己哪种方式最快/最有效时,我一直在使用这个版本:

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

问候, 瓦西里

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多