我想使用 system.data.sqlite 读取表中的所有行。由于我有一个非常大的表(>450GB,超过 60 亿行),我想确保 sqlite 将使用连续的磁盘访问。正如您可能知道的那样,对硬盘的随机访问速度很慢。由于内存限制,我无法一次加载所有数据。因此,最佳方法是,如果 sqlite 读取数百 MB(连续),那么我处理该数据,而 sqlite 读取下一个数据。
我如何确定 sqlite 将以这种方式进行磁盘访问,而不是从硬盘上的一个位置跳到另一个位置?
我知道的事情(我认为这些建议会出现):
- 使用其他 DBMS 可能会更好。但我想/需要用这个来解决它。
- 我知道当我处理这些数据时,磁盘头将由操作系统定位在其他数据上。这没关系。只是连续读取几百MB而已。
- 我不想/可以将数据库文件分割成更小的部分
我找到了这篇文章,但它没有正确解决我的问题:
检索 SQLite 中所有项目的最快方法是什么? https://stackoverflow.com/questions/2947165/which-is-the-fastest-way-to-retrive-all-items-in-sqlite
这就是聚集索引的用途。 sqlite 不支持它们。
以下内容复制自:http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows
四:聚集索引
SQLite 不支持聚集索引(简单来说,强制索引
数据库中的数据以相同的顺序物理放置
因为索引需要它。)
这意味着如果您的索引是连续的 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;
最重要的是,您可以手动重新排序记录,但我想只有当您不打算经常写入表时,这才对您有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)