2011-08-25 41 views
3

我想使用system.data.sqlite讀取表中的所有行。由於我有一個非常大的表(> 450GB,具有> 60億行),我想確保sqlite將使用後繼磁盤訪問。正如你可能知道隨機訪問硬盤速度很慢。由於內存重新調整,我無法一次加載所有數據。所以最佳方式是如果sqlite讀取一百MB(連續),然後我使用這些數據和sqlite讀取下一個。sqlite:獲取所有行(連續磁盤訪問)的最快方法

我怎麼能確定sqlite會這樣做磁盤訪問,而不是從硬盤上的一個位置跳到另一個位置?

事情我知道(我認爲這些建議會顯示):

  • 它可以更好地使用其他DBMS。但我想/需要解決這個問題。
  • 我知道磁盤頭將由OS定位在其他數據上,而我正在處理這些數據。這並不重要。這只是一些hundret MB將連續閱讀。
  • 我不想/可拆分數據庫文件成較小的碎片

我發現這個職位,但它沒有正確解決我的問題:
Which is the fastest way to retrieve all items in SQLite?

回答

4

這就是聚集索引是給。儘管sqlite不支持它們。 http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows

四:

以下是從複製聚集索引

SQLite不支持的聚簇索引(簡單地說,強制在數據庫 的數據指標進行物理佈局按照相同的順序 作爲索引需要它在)

這意味着,如果您的索引是順序INTEGER,記錄是 在該整數爲了數據庫的物理佈局,然後1 2 3.然後

你不能讓一個聚集索引,但你可以爲了 讓你的數據進行分類,任何歷史數據是很好的排序。當然,隨着 數據庫的成熟,你會失去它,但它有幫助

其他人發佈了這個,這是一個很好的例子,所以我會。 如果你有一個表WIBBLE的字段KEY你想訪問很多, 這將是很好,如果一切順利。使用命令行 工具,您可以通過創建一個假的集羣以下內容:

create table wibble2 as select * from wibble; 
delete from wibble; 
insert into wibble select * from wibble2 order by key; 
drop table wibble2; 

底線是,你可以手動將記錄重新排序,但我想這將是你只有當實際你不打算經常寫信給桌子。

1

SQLite中,表中的行存儲由rowid排序,所以在這個順序來讀取行的最有效方法是通過此列(或您與INTEGER PRIMARY KEY聲明的別名)排序:

SELECT * FROM wibble ORDER BY rowid 

對於WITHOUT ROWID表,你按主鍵列(S):

SELECT * FROM wibble ORDER BY MyPrimary, KeyColumns 
0

從@CL。回答this post

SQLite中,用CREATE INDEX創建的索引非聚集索引 。

從版本3.8.2開始,SQLite支持WITHOUT ROWID表,它們是 聚簇索引。