2009-07-20 64 views
0

我运行以下命令SAS:PROC SQL删除花费的时间太长

Proc SQL; 
Delete From Server003.CustomerList; 
Quit; 

正在这8分钟......当只需要几秒钟就可以读取该文件。什么可能导致删除需要这么长时间,我可以做些什么来使其更快?

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

感谢,

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

+0

您使用的是哪种数据库系统? – AFHood 2009-07-21 15:52:16

回答

8

这不是常规的SQL。 SAS'Proc SQL不支持Truncate语句。理想情况下,您想知道delete from的性能如何;但如果你真正需要的是截断功能,那么你总是可以只使用纯SAS,而不要混淆SQL。

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

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

2

我还会提到,通常SQL命令在SAS PROC SQL中运行速度较慢。最近,我做了一个项目,并将TRUNCATE TABLE语句移动到存储过程中,以避免将它们放在SAS内部并由SQL Optimizer和周围的执行shell处理。最终,这大大提高了TRUNCATE TABLE的性能。

2

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

+0

即使有索引,如果你有很多索引,它也可能需要一段时间。我们的主表有超过100个外键(嘿,我没有设计这个东西),并且需要很长时间才能删除一条记录。 – HLGEM 2009-07-21 13:41:11

1

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

至于解决方法没有删除/截断,好问题! :)

0

尝试添加以下内容到LIBNAME声明:

DIRECT_EXE=DELETE 

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

性能使用DIRECT_EXE =显著改善,因为SQL delete语句直接传递到DBMS,而不是的SAS读取整个结果集并一次删除一行。