2014-06-19 123 views
2

我得到了一個SQLite數據庫(第一個項目與SQLite),我需要一次刪除大量的記錄,這就像14.000記錄。排隊如下(我更改了名稱以便更好地閱讀):SQLite刪除慢

delete from table_1 where table_2_id in (
    select id from table_2 where table_3_id in ( 
     select id from table_3 
     where (deleted = 1 or 
       table_4_id in (select id from table_4 where deleted = 1)))); 

此查詢需要8分鐘時間才能刪除。但是當我做

select * from table_1 where table_2_id in (
    select id from table_2 where table_3_id in ( 
     select id from table_3 
     where (deleted = 1 or 
       table_4_id in (select id from table_4 where deleted = 1)))); 

它給了我3秒的結果。

我嘗試使用事務,緩存大小,日記模式,但我沒有得到它的工作,以獲得更好的性能。我錯過了什麼?

+0

創建臨時表(' CREATE TEMP TABLE to_delete AS select table_1_id FROM table1 ...');使用該功能刪除的速度有多快(從table_1中刪除table_1_id到to_delete中)? –

+0

感謝您的快速響應。要創建臨時表,它需要的時間少於一秒,所以看起來性能是正確的。要刪除具有查詢的特定數據「從table_1中刪除where table_1_id in(select id from to_delete)」,那麼它又需要8分鐘。 – user3756056

+0

數據庫文件有多大?你有多少內存?什麼文件系統?網絡? –

回答

0

它是30MB,也是virusscanner的,但沒有任何結果。所以我嘗試了很多東西,我複製了數據庫,刪除了所有外鍵並再次嘗試,而且速度更快。那麼我把所有的外鍵索引,它也快速刪除。所以這是解決方案,但我不知道爲什麼然後選擇快速並刪除超級慢。但希望這有助於任何人!

0

你有涉及任何列的索引?如果是這樣,請考慮刪除它,然後重建它。如果你不這樣做,請嘗試添加一個。

1

我有同樣的問題。解決方法是將它分成許多較小的塊,並一次又一次地執行,直到沒有更多的行受到影響(sqlite3_changes()返回零)。

當然這種方式操作沒有儘快完成,但表格不會持續太久鎖定。 希望這可以幫助別人。

-1

我在python腳本刪除的SQLite數據庫的條目,LFL是,我想從數據庫中刪除的文件列表,在語句中的速度處理大量:

while len(lfl)>0: 
    print ("Deleting entries in DB: ",len(lfl)) 
    sql="""delete from md5t where file in ('%s')"""%('\',\''.join(tuple(lfl[:500]))) 
    cursor.execute(sql) 
    db.commit() 
    del lfl[:500]