2011-08-25 52 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表,它们是 聚簇索引。