sqlite:获取所有行的最快方法(连续磁盘访问)

时间:2011-08-25 19:46:36

标签: sqlite system.data.sqlite

我想使用system.data.sqlite读取表中的所有行。由于我有一个非常大的表(> 450GB,行数> 60亿),我想确保sqlite将使用连续的磁盘访问。您可能知道随机访问硬盘很慢。由于内存不足,我无法一次加载所有数据。所以最好的方法是如果sqlite读取几百MB(连续),那么我使用这些数据,sqlite读取下一个。

我怎样才能确定sqlite会以这种方式进行磁盘访问而不是从硬盘上的一个位置跳转到另一个位置?

我知道的事情(我认为这些建议会出现):

  • 使用其他DBMS可能会更好。但我希望/需要解决这个问题。
  • 我知道当我处理数据时,操作系统会将磁盘头定位在其他数据上。这没关系。只是连续阅读一些hundret MB。
  • 我不想/可以将数据库文件拆分成更小的部分

我找到了这篇文章,但它没有正确解决我的问题:
Which is the fastest way to retrieve all items in SQLite?

3 个答案:

答案 0 :(得分:5)

这就是聚集索引的用途。 sqlite虽然不支持它们。

以下内容复制自:http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows

  

四:聚集索引

     

SQLite不支持聚簇索引(简单地说,就是强制索引)   数据库中的数据将按照SAME顺序进行物理规划   因为索引需要它。)

     

这意味着如果您的索引是顺序INTEGER,则记录为   按照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 :(得分:1)

在SQLite中,表行按[{3}}排序存储,因此按此顺序读取行的最有效方法是按此列排序(或使用INTEGER PRIMARY KEY声明的别名):< / p>

SELECT * FROM wibble ORDER BY rowid

对于rowid表,按主键列排序:

SELECT * FROM wibble ORDER BY MyPrimary, KeyColumns

答案 2 :(得分:1)

来自@CL。在this post中回答:

  

在SQLite中,使用CREATE INDEX创建的索引是非群集的   索引。

     

从版本3.8.2开始,SQLite支持WITHOUT ROWID表,它们是   聚集索引。

相关问题