2014-04-28 295 views
0

我想清理舊的SQLite3數據庫,從中刪除約30,000條舊記錄。
要刪除我使用這個查詢:加快速度很慢的查詢

DELETE 
FROM 
    ITEMS 
WHERE 
    ITEMS_ID IN (
     SELECT 
      ITEMS_ID 
     FROM 
      ITEMS 
     WHERE 
      LASTSALEDATE NOT LIKE '2014%' 
     AND LASTSALEDATE NOT LIKE '2013%' 
     AND LASTSALEDATE NOT LIKE '2012%' 
     AND ITEMS_ID != 1 
     AND ITEMS_ID != 4 
    ); 

的問題是,我已經注意到這個查詢是很慢的,或者更好,那麼慢,它需要年齡和我已經中止,因爲似乎卡住了。

我覺得問題是SELECT裏面的裏面每個行都被重複刪除。

我該如何解決這個問題?

+2

你爲什麼不把DELETE語句中的WHERE strait? – Prasanna

+0

我簡化了一下,SELECT用在多個表格中,但在這種情況下你可能是正確的... –

+0

其中lastsaledate <'2012'而不是3個不喜歡可能有幫助。 –

回答

1

使得大量刪除之前,請確保有運行中的幕後沒有刪除觸發器,可以導致delete聲明相當慢下來。

我不認爲有可能暫時禁用SqlLite中的觸發器,因爲它在其他DBMS中。所以,你必須:

  1. 保存刪除觸發腳本
  2. 刪除刪除觸發器(S)
  3. 運行刪除查詢
  4. 重新創建刪除觸發器(S)

另外,在禁用它們之前,試着瞭解這些刪除觸發器在做什麼。他們可能會做一些重要的事情,例如數據審計或更改對維護數據完整性至關重要。在這種情況下,可能需要一些耐心,稍等一下才能完成刪除操作。

2

爲什麼你有IN呢?

DELETE 
    FROM 
     ITEMS 
    WHERE 
     LASTSALEDATE NOT LIKE '2014%' 
    AND LASTSALEDATE NOT LIKE '2013%' 
    AND LASTSALEDATE NOT LIKE '2012%' 
    AND ITEMS_ID != 1 
    AND ITEMS_ID != 4 

編輯:

假設一個更復雜的結構,你有沒有詳細的,這可能是比IN更有效......

DELETE 
    ITEMS 
FROM 
(
    SELECT 
    ITEMS_ID 
    FROM 
    ITEMS 
    WHERE 
     LASTSALEDATE NOT LIKE '2014%' 
    AND LASTSALEDATE NOT LIKE '2013%' 
    AND LASTSALEDATE NOT LIKE '2012%' 
    AND ITEMS_ID != 1 
    AND ITEMS_ID != 4 
    GROUP BY 
    ITEMS_ID 
) 
    AS lookup 
WHERE 
    lookup.ITEMS_ID = ITEMS.ITEMS_ID 

另外,根據LASTSALEDATE的數據類型,請嘗試使用此WHERE子句。

WHERE 
     LASTSALEDATE < '2012-01-01' 
    AND ITEMS_ID  <> 1 
    AND ITEMS_ID  <> 4 
+0

@FezVrasta:如需更詳細的反饋,請提供更完整的問題查詢示例。 – MatBailie

+0

謝謝,LASTSALEDATE是'timestamp' –

相關問題