2009-07-20 65 views
0

我運行以下命令SAS:PROC SQL刪除花費的時間太長

Proc SQL; 
Delete From Server003.CustomerList; 
Quit; 

正在這8分鐘......當只需要幾秒鐘就可以讀取該文件。什麼可能導致刪除需要這麼長時間,我可以做些什麼來使其更快?

(我沒有訪問刪除表,所以我只能刪除所有行)

感謝,

編輯:我顯然也不能截短表。

+0

您使用的是哪種數據庫系統? – AFHood 2009-07-21 15:52:16

回答

8

這不是常規的SQL。 SAS'Proc SQL不支持Truncate語句。理想情況下,您想知道delete from的性能如何;但如果你真正需要的是截斷功能,那麼你總是可以只使用純SAS,而不要混淆SQL。

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

這有效地執行和操作就像一個Truncate會。它維護數據集/表結構,但未能用數據填充(由於OBS =選項)。

2

我還會提到,通常SQL命令在SAS PROC SQL中運行速度較慢。最近,我做了一個項目,並將TRUNCATE TABLE語句移動到存儲過程中,以避免將它們放在SAS內部並由SQL Optimizer和周圍的執行shell處理。最終,這大大提高了TRUNCATE TABLE的性能。

2

是否有很多其他表有這個表的外鍵?如果這些表在外鍵列上沒有索引,那麼SQL可能需要一些時間來確定是否可以安全地刪除這些行,即使其他表中沒有其他表中實際上有外鍵值列)。

+0

即使有索引,如果你有很多索引,它也可能需要一段時間。我們的主表有超過100個外鍵(嘿,我沒有設計這個東西),並且需要很長時間才能刪除一條記錄。 – HLGEM 2009-07-21 13:41:11

1

它可能比較慢,因爲磁盤寫入通常比讀取要慢。

至於解決方法沒有刪除/截斷,好問題! :)

0

嘗試添加以下內容到LIBNAME聲明:

DIRECT_EXE=DELETE 

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

性能使用DIRECT_EXE =顯著改善,因爲SQL delete語句直接傳遞到DBMS,而不是的SAS讀取整個結果集並一次刪除一行。