我运行以下SAS命令:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

这是走在8分钟内...当只需要几秒钟就可以读取该文件。可能是什么造成了删除,以这么长的时间,我可以做些什么来让它走得更快?

(I没有访问删除表,所以只能删除所有行)

谢谢,

编辑:我显然也不能截短表

有帮助吗?

解决方案

这是不正规的SQL。 SAS的PROC SQL不支持截断声明。理想情况下,你想弄清楚这是怎么回事与delete from的性能;但如果你真正需要的是截断功能,你总是可以只使用纯SAS和不乱用SQL的。

data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;

这有效地执行并且操作等将一个Truncate。它维护数据集/表的结构,但失败,数据填充它(由于OBS =选项)。

其他提示

是否有很多具有外键到这个表其他表的?如果这些表不具备外键列(一个或多个)索引那么它可能需要一段时间的SQL,以确定它是否可以安全地删除行,即使没有其他的表实际上有外键的值柱(一个或多个)。

我还要提到的是在一般的SQL命令在SAS PROC SQL运行速度较慢。最近我做了一个项目,移动将truncate table语句转换成一个存储过程,以避免他们的内部SAS和他们的SQL优化器正在处理和周围的外壳执行的刑罚。最终这增加了TRUNCATE TABLE基本上的性能。

,因为磁盘写入通常比读出速度较慢这可能是更慢。

作为变通的办法不失/截断,很好的问题! :)

你可以添加以下到您的LIBNAME语句:

DIRECT_EXE=DELETE 

根据 SAS / ACCESS(R)为9.2的关系数据库:参考

  

性能通过使用显著提高DIRECT_EXE =,因为SQL删除语句被直接传递到DBMS,代替SAS读取整个结果集,并一次删除的一行。

您也可以考虑优雅的:

PROC SQL;创建表libname.tablename像libname.tablename;放弃;

我将产生一个新的表具有相同的名称和你的上表中相同的元数据,并删除旧的在同一个操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top