0

我正在运行以下 SAS 命令:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

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

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

谢谢,

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

4

6 回答 6

9

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

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

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

于 2009-07-26T17:08:39.363 回答
3

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

于 2009-07-20T22:32:27.067 回答
2

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

于 2009-07-20T21:50:12.470 回答
2

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

DIRECT_EXE=DELETE 

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

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

于 2013-02-25T08:45:03.270 回答
1

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

至于在不丢失/截断的情况下绕过它的方法,好问题!:)

于 2009-07-22T00:54:06.653 回答
1

你也可以考虑优雅:

过程 sql; 像 libname.tablename 一样创建表 libname.tablename;辞职;

我将生成一个与您之前的表具有相同名称和相同元数据的新表,并在同一操作中删除旧表。

于 2019-03-27T14:05:23.683 回答