我運行以下命令SAS:PROC SQL刪除花費的時間太長
Proc SQL;
Delete From Server003.CustomerList;
Quit;
正在這8分鐘......當只需要幾秒鐘就可以讀取該文件。什麼可能導致刪除需要這麼長時間,我可以做些什麼來使其更快?
(我沒有訪問刪除表,所以我只能刪除所有行)
感謝,
丹
編輯:我顯然也不能截短表。
我運行以下命令SAS:PROC SQL刪除花費的時間太長
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命令在SAS PROC SQL中運行速度較慢。最近,我做了一個項目,並將TRUNCATE TABLE語句移動到存儲過程中,以避免將它們放在SAS內部並由SQL Optimizer和周圍的執行shell處理。最終,這大大提高了TRUNCATE TABLE的性能。
是否有很多其他表有這個表的外鍵?如果這些表在外鍵列上沒有索引,那麼SQL可能需要一些時間來確定是否可以安全地刪除這些行,即使其他表中沒有其他表中實際上有外鍵值列)。
即使有索引,如果你有很多索引,它也可能需要一段時間。我們的主表有超過100個外鍵(嘿,我沒有設計這個東西),並且需要很長時間才能刪除一條記錄。 – HLGEM 2009-07-21 13:41:11
它可能比較慢,因爲磁盤寫入通常比讀取要慢。
至於解決方法沒有刪除/截斷,好問題! :)
嘗試添加以下內容到LIBNAME
聲明:
DIRECT_EXE=DELETE
據SAS/ACCESS(R) 9.2 for Relational Databases: Reference,
性能使用DIRECT_EXE =顯著改善,因爲SQL delete語句直接傳遞到DBMS,而不是的SAS讀取整個結果集並一次刪除一行。
您使用的是哪種數據庫系統? – AFHood 2009-07-21 15:52:16