2012-07-27 46 views
0

我有一個表中有近300K記錄。我運行一個簡單的SELECT語句,其中在索引列條款(「類型」被索引):在iPad上的SQLite緩慢查詢

SELECT * 
FROM Asset_Spec 
WHERE type = 'County' 

查詢是快 - 約1秒。此外,我想測試狀態:

SELECT * 
FROM Asset_Spec 
WHERE type = 'County' 
AND status = 'Active' 

第二個是非常慢(分鐘)。狀態不是索引的,在這種情況下,數據庫中有99.9%的值是「有效的」。

任何想法如何獲得更好的表現?我們正在整理自己的SQLite的版本,所以我可以調整許多設置(僅供參考 - iOS上的預罐頭SQLite的性能相同)

+0

是否有某些原因導致您不在兩列上創建另一個索引? – Rob 2012-07-27 19:07:41

回答

2

我查看了查詢計劃,並且行數的估計值被一個驚人的數量關閉。 Asset_Spec(〜2行) - 實際行數近300,000。 Ran'ANALYZE' - 現在相同的查詢在16ms內運行。

1

的第一件事,我會嘗試使用子查詢

SELECT * FROM 
(SELECT * 
FROM Asset_Spec 
WHERE type = 'County') 
WHERE status = 'Active' 

和羅伯特。建議,在要過濾的任何列上添加索引是個不錯的主意。我還會考慮將字段類型和狀態更改爲字符串以外的內容。

0

你需要選擇*的任何理由?

建議:

你需要檢索多個記錄?如果您只需要找到第一條記錄,則將「限制1」添加到查詢的末尾。

如果您只是檢查是否存在一行,即您只需要知道有一行狀態爲活動狀態,則選擇「1」而不是「選擇*」。