【问题标题】:Database with a table containing 700 million records [duplicate]具有包含 7 亿条记录的表的数据库 [重复]
【发布时间】:2012-04-10 17:06:12
【问题描述】:
【问题讨论】:
标签:
c#
.net
sql-server
database
sqlite
【解决方案2】:
700m 很多。
给你一个想法。假设您的记录大小为 4 个字节(基本上存储一个值),那么您的数据库将超过 2GB。如果您的记录大小接近 100 字节,那么它接近 65GB...(不包括索引使用的空间和事务日志文件等)。
我们在大型数据库方面做了很多工作,我从不会考虑使用 SQLLite 来处理这种规模的任何事情。坦率地说,“可移植性”是您最不关心的问题。为了以任何响应能力查询该大小的数据库,您将需要一个适当大小的数据库服务器。我会开始使用 32GB 的 RAM 和快速驱动器。
如果它的写入量超过 90%,您可能会使用较小的 RAM。如果它的阅读量很大,那么您将需要尝试构建它,以便机器可以在 RAM 中加载尽可能多的数据库(或至少是索引)。否则,您将依赖磁盘主轴速度。
【解决方案3】:
SQLite 应该能够处理这么多数据。但是,您可能必须对其进行配置以使其增长到这个大小,并且您不应该在 SQLite 的“内存中”实例中拥有这么多数据,这只是一般原则。
有关更多详细信息,请参阅this page,其中解释了 SQLite 引擎的实际限制。相关的配置设置是页面大小(通常为 64KB)和页面计数(最多 64 位 int 的最大值约为 21 亿)。算一算,整个数据库可以占用超过 140TB。由具有 700m 行的单个表组成的数据库将是数十个 gigs 的数量级;易于管理。
但是,仅仅因为 SQLite 可以存储这么多数据并不意味着您应该这样做。 SQLite 对于大型数据存储的最大缺点是 SQLite 代码作为进程的一部分运行,使用调用它的线程并占用沙箱中的内存。您无法获得面向服务器的 DBMS 中可用的工具来“分而治之”大型查询或数据存储,例如复制/集群。在处理这样的大表时,插入/删除将需要很长时间才能将其放置在正确的位置并更新所有索引。选择可能是宜居的,但仅限于索引查询;页面或表格扫描绝对会杀死你。