2017-04-19 158 views
1

我正在使用SQlite來存儲大量數據,並且遇到了使用非常簡單的查詢來提取數據的麻煩。目前,我的數據庫只有一張表,大約有5000萬行和15列。我想從這張表中提取一個完整的列。如何最好地從大型SQLite數據庫中有效地提取數據?

我試過使用RSQlite:dbGetQuery(db, ‘select qs from CSI’)其中qsCSI分別是我的列名和表名。 Q是字符串。這個查詢在放棄之前運行幾個小時(R版本3.3.3,RSQLite_1.1-2)。

我也嘗試了DB瀏覽器的SQLite(v3.9.1),使用相同的查詢,並在運行幾個小時後再次放棄。我沒有IDKey /索引,但是我想因爲我想要整個列,所以這不應該有任何影響。

我在64位Windows機器上運行,內存爲16GB。如何在合理的時間內從我的表中提取列?還是有更好的方式,我應該存儲我的數據以方便訪問?

+1

作爲一個方面說明..我有一個類似的問題,並開始使用'MonetDBLite'(https://www.monetdb.org/blog/monetdblite-r)而不是'SQLite',這使得整個過程快得多(MonetDB使用列式存儲,而SQLite使用面向行式存儲) –

+0

感謝@docendo,我會給MonetDBLite一個去。你知道有沒有一種好的方法可以將我的RSQLite表直接導入到MonetDBLite中?創建它們非常耗時,我想避免再次這樣做。乾杯。 – nm200

+0

如果我沒有記錯,我創建了我的sqlite數據庫的csv導出,然後將其加載到monetdblite db中 –

回答

2

要獲得一個列值,SQLite必須讀取直到該列的行。因此,要從所有行中獲取值,它必須幾乎讀取所有內容。

使用此列的索引,您將擁有一個covering index,這將減少要從磁盤讀取的數據量。

如果您實際上不需要來自同一行的多個值,請考慮將列存儲在不同的表中或使用其他數據庫。

+0

謝謝CL,添加索引使事情變得更快! – nm200

相關問題