2012-09-26 44 views
0

我有一個Access數據庫擁有超過500000條記錄,我想批量刪除記錄。我得到我需要的基礎上刪除某些條件ID的列表,這可能是1〜5000。現在我的代碼看起來像這樣的CDatabase ::的ExecuteSQL批量刪除Access數據庫

for (i = 0 to 5000) 
{ 
    CDatabase.ExecuteSQL(Delete from table where id = ItemToDelete(i)) 
} 

它會針對每個SQL調用近1秒。

是否有一個選項來執行批量刪除或是否有更好的方法來做到這一點?

+0

訪問權限僅限於單批處理。 IE每批只允許一個SQL語句。如果你想做大量的刪除操作,那麼把ID放在Where子句中作爲一個String,然後將它發送給Access進行處理。刪除*從表(id)在(.....)中的表格中刪除。 Access不是一個高效的DBMS。這意味着真正的單人操作。 – GoldBishop

+0

@GoldBishop 5000 ID與IN是任何數據庫的一個非常糟糕的主意。 Access不是DBMS,它通常使用Jet/ACE RDBMS,但並非總是如此。它不是一人操作的,它是多用戶的。正確使用時可以高效。 – Fionnuala

+0

也許糟糕的想法....大概解決了這個問題。不進入辯論,但訪問是一個1-5人的數據庫管理系統(其中包括RDBMS),這是由透視定義1人系統。 – GoldBishop

回答

0

我沒有做過訪問多年,但我有同樣的挑戰。我不會獲得滿足某些條件的所有記錄,而是首先嚐試發出DELETE WHERE「某些條件」。它可能仍然是緩慢的,但SQL調用的#將減少5000至1

有了這樣大的#的,更極端的解決辦法可能是剛剛傾倒整個表到一個文本文件,寫一個小程序重新加載它只有你想要的。對於1次的東西可能不是一個很好的解決方案,但如果你這樣做,每月....

但在一般情況下,儘量減少#SQL調用是提高性能的最佳方式。根據服務器的不同,如果WHERE子句只包含主鍵字段,刪除操作可能會快很多。

+0

的問題我很困惑..我想我是這樣做..可能是我的帖子不清楚。在我的ExecuteSQL()中,我調用了一條sql語句「DELETE FROM table1 WHERE ID = i」是這樣嗎? – bMathew

+1

我在想更多的東西,比如「從table1中刪除ID IN(4,5,76,99)」;只是發出這個單一的電話。如果它的ID等於0到5000,它可能只是「DELETE FROM table1 WHERE ID> = 0 AND ID <= 5000」;但也許這些ID只是例子。 –

+0

根據我的情況,需要刪除的記錄數可能是1或5000.我不確定查找記錄是否需要時間或實際執行。我會嘗試你的建議,但首先讓我看看我是否可以創建一個像這樣的字符串。 – bMathew

0

這種說法應該是:

Delete from table where id between 1 and 5000 

如果你有一個條件,在大多數情況下,你應該能夠建立一個WHERE語句。不要試圖用IN單獨列出5000個ID。你會遇到各種限制。

如果不可能區分用於刪除條件,從個人ID可以在表或CSV,或者將與工作列出。

+0

你錯過了身份證不在1和5000之間的事實,他將有1到5000個ID來處理。而將這些選項放入IN聲明中的選項是切斷一個選項,儘管很重,但是是一種選擇。他有一個查詢執行問題,而不是查詢設計問題。 – GoldBishop

+0

@GoldBishop我沒有遺漏任何東西。該代碼示例說,對於i = 0到5000刪除i,即刪除0到5000之間的每一行。他或她逐行運行而不是設置。 – Fionnuala

+0

'0到5000' ID不是ID的0到5000.儘管他的示例代碼與他的問題主體矛盾,但請再次閱讀。 – GoldBishop