2015-11-29 22 views
0

我在LINUX上有100GB SAS數據集。從數據集中刪除50 GB數據後爲數據集分配的空間仍爲100 GB。 我不確定這是否與SAS或LINUX有關。刪除行後,LINUX上的SAS數據集大小不變

下面的代碼被執行刪除:

Proc SQL; Delete * from dataset where Column=value; Quit; 
+2

刪除記錄不會自動縮小數據的大小:http://support.sas.com/kb/32/042.html。 –

+1

@shawn的回答很有意義。請顯示您如何刪除觀察結果,以確認您做了邏輯刪除是正確的。 – Quentin

+0

我只是使用Proc SQL;從Column = value的數據集中刪除*;放棄; –

回答

0

如其他人指出的那樣,PROC SQL DELETE執行邏輯刪除而不是物理刪除。

儘管可以分兩步進行,但在數據步驟中執行此操作會更快(因此只需一步)。如果您DELETE是一個簡單的where子句:

data have; 
    set have; 
    where column ne value; 
run; 

的WHERE子句使用SQL語法,所以LIKE和BETWEEN和如法律存在。這會將刪除處理爲物理刪除,並且您的新數據集將變小。

+0

謝謝喬。我在SQL刪除之後做了一個proc排序,並且回收了分配給已刪除觀察值的空間。 –

+0

@Sampath_T這也行得通 - 你應該將它作爲答案!我懷疑它不如我的解決方案那麼快,但是如果你需要排序,它可能沒有太大的區別。 – Joe

1

的問題是,你執行一個邏輯刪除而不是物理刪除。戈登的正確評論指向你SAS Note 32042給出了這種行爲相當簡潔的官方描述。 物理刪除已刪除記錄的最簡單方法是從當前文件重新創建數據文件,這將導致SAS清除邏輯刪除的觀察值。 這可能類似於以下代碼模式之一。

data mydata; 
set mydata; 
run; 

proc sql; 
create table mydata as 
select * from mydata; 
quit; 
+0

當我試圖從當前文件重新創建數據文件時,它清理了刪除的觀察結果並釋放了空間。但是,我收到了警告。警告:此CREATE TABLE語句遞歸引用目標表。這樣的後果是可能的數據完整性 問題。 –

+0

警告消息很麻煩,但如果您使用的是像我一樣的sql模式(基本覆蓋單個文件),則不需要擔心。 – shawn

+0

我在SQL刪除之後做了一個proc分類,它回收了分配給刪除觀察的空間。 –