LINUX 上的 SAS 数据集大小在删除行后没有改变
SAS dataset size on LINUX is not changing after deleting rows
我在 LINUX 上有 100GB 的 SAS 数据集。 Space 从数据集中删除 50 GB 数据后分配给数据集的数据仍然是 100 GB。
我不确定这是否与 SAS 或 LINUX.
有关
下面的代码正在执行删除:
Proc SQL; Delete * from dataset where Column=value; Quit;
问题是您执行的是逻辑删除而不是物理删除。 Gordon 将您指向 SAS Note 32042 的正确评论给出了对此行为的相当简洁的官方描述。
物理删除已删除记录的最简单方法是从当前文件重新创建数据文件,这将导致 SAS 清理逻辑删除的观察值。
这可能类似于以下代码模式之一。
data mydata;
set mydata;
run;
proc sql;
create table mydata as
select * from mydata;
quit;
正如其他人所说,PROC SQL DELETE
执行逻辑删除,而不是物理删除。
虽然您可以分两步完成此操作,但在数据步骤中执行此操作会更快(因此您只有一步)。如果您的 DELETE 是一个简单的 where 子句:
data have;
set have;
where column ne value;
run;
WHERE 子句使用 SQL 语法,因此 LIKE 和 BETWEEN 等在那里是合法的。这会将删除处理为物理删除,并且您的新数据集会更小。
我在 LINUX 上有 100GB 的 SAS 数据集。 Space 从数据集中删除 50 GB 数据后分配给数据集的数据仍然是 100 GB。 我不确定这是否与 SAS 或 LINUX.
有关下面的代码正在执行删除:
Proc SQL; Delete * from dataset where Column=value; Quit;
问题是您执行的是逻辑删除而不是物理删除。 Gordon 将您指向 SAS Note 32042 的正确评论给出了对此行为的相当简洁的官方描述。 物理删除已删除记录的最简单方法是从当前文件重新创建数据文件,这将导致 SAS 清理逻辑删除的观察值。 这可能类似于以下代码模式之一。
data mydata;
set mydata;
run;
proc sql;
create table mydata as
select * from mydata;
quit;
正如其他人所说,PROC SQL DELETE
执行逻辑删除,而不是物理删除。
虽然您可以分两步完成此操作,但在数据步骤中执行此操作会更快(因此您只有一步)。如果您的 DELETE 是一个简单的 where 子句:
data have;
set have;
where column ne value;
run;
WHERE 子句使用 SQL 语法,因此 LIKE 和 BETWEEN 等在那里是合法的。这会将删除处理为物理删除,并且您的新数据集会更小。