Proc SQL Delete花费的时间太长了

时间:2009-07-20 21:42:10

标签: sql sas proc-sql

我正在运行以下SAS命令:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

这需要花费8分钟......只需几秒钟即可阅读该文件。什么可能导致删除需要这么长时间,我该怎么做才能让它更快?

(我没有权限删除表,所以我只能删除所有行)

谢谢,

编辑:我显然也不能截断表格。

6 个答案:

答案 0 :(得分:8)

这不是常规SQL。 SAS'Proc SQL不支持Truncate语句。理想情况下,您想要弄清楚delete from的表现正在发生什么;但如果你真正需要的是截断功能,你可以随时使用纯SAS而不是乱用SQL。

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

这有效地执行和运作,就像Truncate一样。它维护数据集/表结构,但无法用数据填充它(由于OBS =选项)。

答案 1 :(得分:3)

是否有很多其他表具有此表的外键?如果这些表在外键列上没有索引,则SQL可能需要一段时间才能确定删除行是否安全,即使其他表中没有其他表实际上具有外键值柱(一个或多个)。

答案 2 :(得分:2)

我还要提一下,一般来说,SQL命令在SAS PROC SQL中运行较慢。最近我做了一个项目,并将TRUNCATE TABLE语句移动到一个存储过程中,以避免将它们置于SAS内部并由SQL Optimizer和周围的执行shell处理。最后,这大大提高了TRUNCATE TABLE的性能。

答案 3 :(得分:1)

它可能会更慢,因为磁盘写入通常比读取慢。

至于解决方法而不丢弃/截断,好问题! :)

答案 4 :(得分:1)

尝试将此添加到您的LIBNAME声明:

DIRECT_EXE=DELETE 

根据SAS/ACCESS(R) 9.2 for Relational Databases: Reference

  

使用DIRECT_EXE =可以显着提高性能,因为SQL delete语句直接传递给DBMS,而不是SAS读取整个结果集并一次删除一行。

答案 5 :(得分:1)

您还可以考虑优雅:

proc sql;创建表libname.tablename,如libname.tablename;放弃;

我将生成一个新表,该表具有与上一个表相同的名称和元数据,并通过相同的操作删除旧表。