我运行以下命令SAS:PROC SQL删除花费的时间太长
Proc SQL;
Delete From Server003.CustomerList;
Quit;
正在这8分钟......当只需要几秒钟就可以读取该文件。什么可能导致删除需要这么长时间,我可以做些什么来使其更快?
(我没有访问删除表,所以我只能删除所有行)
感谢,
丹
编辑:我显然也不能截短表。
我运行以下命令SAS:PROC SQL删除花费的时间太长
Proc SQL;
Delete From Server003.CustomerList;
Quit;
正在这8分钟......当只需要几秒钟就可以读取该文件。什么可能导致删除需要这么长时间,我可以做些什么来使其更快?
(我没有访问删除表,所以我只能删除所有行)
感谢,
丹
编辑:我显然也不能截短表。
这不是常规的SQL。 SAS'Proc SQL不支持Truncate语句。理想情况下,您想知道delete from
的性能如何;但如果你真正需要的是截断功能,那么你总是可以只使用纯SAS,而不要混淆SQL。
data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;
这有效地执行和操作就像一个Truncate
会。它维护数据集/表结构,但未能用数据填充(由于OBS =选项)。
我还会提到,通常SQL命令在SAS PROC SQL中运行速度较慢。最近,我做了一个项目,并将TRUNCATE TABLE语句移动到存储过程中,以避免将它们放在SAS内部并由SQL Optimizer和周围的执行shell处理。最终,这大大提高了TRUNCATE TABLE的性能。
是否有很多其他表有这个表的外键?如果这些表在外键列上没有索引,那么SQL可能需要一些时间来确定是否可以安全地删除这些行,即使其他表中没有其他表中实际上有外键值列)。
即使有索引,如果你有很多索引,它也可能需要一段时间。我们的主表有超过100个外键(嘿,我没有设计这个东西),并且需要很长时间才能删除一条记录。 – HLGEM 2009-07-21 13:41:11
它可能比较慢,因为磁盘写入通常比读取要慢。
至于解决方法没有删除/截断,好问题! :)
尝试添加以下内容到LIBNAME
声明:
DIRECT_EXE=DELETE
据SAS/ACCESS(R) 9.2 for Relational Databases: Reference,
性能使用DIRECT_EXE =显著改善,因为SQL delete语句直接传递到DBMS,而不是的SAS读取整个结果集并一次删除一行。
您使用的是哪种数据库系统? – AFHood 2009-07-21 15:52:16