我正在运行以下 SAS 命令:
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 可能需要一段时间才能确定删除这些行是否安全,即使其他表实际上都没有外键中的值列)。
我还要提一下,通常 SQL 命令在 SAS PROC SQL 中运行速度较慢。最近我做了一个项目并将 TRUNCATE TABLE 语句移动到存储过程中,以避免将它们放在 SAS 中并由它们的 SQL 优化器和周围的执行 shell 处理的惩罚。最后,这大大提高了 TRUNCATE TABLE 的性能。
尝试将此添加到您的LIBNAME
声明中:
DIRECT_EXE=DELETE
根据SAS/ACCESS(R) 9.2 for Relational Databases: Reference ,
使用 DIRECT_EXE= 可以显着提高性能,因为 SQL 删除语句直接传递给 DBMS,而不是 SAS 读取整个结果集并一次删除一行。
它可能会更慢,因为磁盘写入通常比读取慢。
至于在不丢失/截断的情况下绕过它的方法,好问题!:)
你也可以考虑优雅:
过程 sql; 像 libname.tablename 一样创建表 libname.tablename;辞职;
我将生成一个与您之前的表具有相同名称和相同元数据的新表,并在同一操作中删除旧表。