题
我运行以下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;放弃;
我将产生一个新的表具有相同的名称和你的上表中相同的元数据,并删除旧的在同一个操作。