2011-09-07 47 views
3

我試圖從包含幾百萬行的SQLite表中檢索一些最常出現的值。如何優化大多數發生值的檢索(數億行)

查詢到目前爲止可能是這樣的:

SELECT value, COUNT(value) AS count FROM table GROUP BY value ORDER BY count DESC LIMIT 10 

上有value領域的指數。

但是,使用ORDER BY子句,查詢需要很多時間,我從未見過它的結尾。

可以做些什麼來大幅度改善如此大量數據的查詢?
我試圖添加一個HAVING子句(例如:HAVING count> 100000)來降低要排序的行數,但沒有成功。請注意,我並不在乎插入所需的時間(它仍然需要合理,但是優先考慮選擇),所以我打開了解決方案,建議在插入時計算。 ..

由於提前,

+1

Java在哪裏起作用? – Thomas

+0

爲了防止解決方案包含後處理/預處理,這是我用來與db進行交互的語言。 – Sylvain

+0

你正在使用什麼類型的應用程序? –

回答

1

1)創建一個新表在這裏您可以存儲每個獨特的「價值」一列和「伯爵」,把下降的指數計列
2)添加一個觸發器到原來的表,在那裏你根據需要維護此新表(插入和更新)以增加/減少計數。
3)運行你的查詢關閉這個新表,由於計數指數遞減,它將運行得很快

+0

我試過這個解決方案,問題是,插入現在正在花費時間。 我正在做大約300K行的批量插入(使用附加分貝的SELECT INSERT),沒有觸發器,這是在幾秒鐘內完成的,使用觸發器,插入空表需要花費幾個小時 – Sylvain

+0

我建議問一個新問題,在這裏你提供表格模式,觸發器代碼,並詢問如何加速觸發器。 –

+0

這裏你去:http://stackoverflow.com/q/7350432/101969 :-) – Sylvain

1

此查詢的力量,你看錶中的每一行。這是需要時間的。

我幾乎從不推薦這個,但在這種情況下,您可以在外部表中以非規格化的方式維護計數。

在插入,更新和通過觸發器刪除期間,將值和計數放入另一個表中。