我正在运行以下SAS命令:
Proc SQL;
Delete From Server003.CustomerList;
Quit;
这需要花费8分钟......只需几秒钟即可阅读该文件。什么可能导致删除需要这么长时间,我该怎么做才能让它更快?
(我没有权限删除表,所以我只能删除所有行)
谢谢,
丹
编辑:我显然也不能截断表格。
答案 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;放弃;
我将生成一个新表,该表具有与上一个表相同的名称和元数据,并通过相同的操作删除旧表。