2010-07-14 89 views
0

我創建了一個Android應用程序,並且存在將定期刪除舊記錄如何使用日期範圍where子句優化刪除?

delete from tablea where col1 = 'value1' and col2 = 'value2' and postdate < '2010-06-14' 

它的性能問題,當TableA中排的總數已再50,000功能。大約需要45秒才能刪除500條記錄。

我已經有指數爲這個where子句:

CREATE INDEX indexa on tablea (col1, col2, postdate) 

添加PRAGMA同步= OFF和附註count_changes = OFF沒有幫助。

請指教

+0

檢查此查詢生成的字節代碼以及它是否使用廣告的索引。 – 2010-07-14 02:47:46

回答

0

它在我看來好像你的索引是沒有用的書面。我想你會想:

CREATE INDEX indexa on tablea (col1, col2) 
CREATE INDEX indexb on tablea (postdate) 

讀,我的文檔中解釋說,爲了找出排在你的例子被提及,數據庫需要有一個特定的日期,以配合給定一對值(所以它可以查找索引/索引)。你沒有特定的日期。相反,您正在尋找一系列日期值。

問題是日期值的可比性被包含在您創建的組合索引中,因此您無法很容易地將該信息取出,這使得索引的使用受到限制。

當然我可以充滿它。我的主要經驗是不與sqlite。不過,嘗試上述方法應該不會有太大的傷害。

+0

SQLite將只在FROM子句中每個表使用一個索引。因此,將索引拆分爲兩個將無助於此查詢。 – Qberticus 2010-07-14 04:46:51

+0

它不會傷害,因爲上面的索引不會有用,只要我可以天真地講。至少這兩個指標會分別有用,不是嗎? sqlite會選擇更喜歡哪個。 – Slartibartfast 2010-07-15 05:06:31

1

檢查您的postdate字段的類型。 SELECT typeof(postdate)。看起來SQLite將根據你的Where子句將它視爲TEXT。 SQLite沒有「日期」類型的概念,只有一個NUMERIC親和力將發生在任何'日期'。如果你沒有插入NUMERIC,那麼它可能會進行字符串比較,這將比你期望的整數比較慢。如果您插入NUMERIC s,那麼您的where子句可能會導致它們先被投入TEXT,然後再應用where子句條件。

您可以查看documentation about datatypes

+0

我認爲你有這個觀點。 typeof(postdate)='文字'。我會修改它tonite並在這裏發佈結果。 – kentsang77 2010-07-14 07:24:22