【问题标题】:Parallel Index Creation in SQLite3SQLite3 中的并行索引创建
【发布时间】:2015-04-23 05:34:09
【问题描述】:
  • 我有一个约 40Gb 的数据库,其中包含大约 100 个表。
  • 索引表(在所有列上)大约需要 30 分钟。
  • 我的服务器中有 64 个内核。

目前,INDEX 创建过程大约需要 2 天(而数据库创建大约需要 5 小时......)所以它是我管道中的一个极端瓶颈。我正在尝试考虑如何并行化该过程以一次使用多个核心。到目前为止,这是我的想法:

  • 关闭所有写锁定(不知何故?)并使用多个进程来创建索引。由于他们的桌子不同,所以可能没问题。
  • .将主数据库中的每个表转储到自己的小数据库中(仅包含一个表),在不同的内核上分别索引它们,然后将它们重新连接在一起(不知何故?)
  • 优化现有数据库(以某种方式?)以帮助索引器更快地完成任务。可以将数据库移动到 SSD 并使用单个大 CPU 来计算索引(可能会节省一天),或者在创建数据库时对行进行排序?显然不是并行解决方案,但在这一点上,我会采取任何措施。

编辑: 我使用 SQLite 版本 3.3.6

【问题讨论】:

  • 不清楚,是只需要创建一次索引还是时不时重复这个过程?如果需要重复,那么需要从头开始重建所有索引的应用是什么?
  • 我只需要为我的数据库创建一次索引(一旦添加了一个表,它就永远不会更新),但是整个 40Gb 数据库不时使用新的/不同的数据创建跨度>
  • 您还写了您正在为表中的所有列创建索引,这是必要的吗?索引通常是为一组有限的列创建的。
  • 好的,那么您的建议 1 和 2 似乎可行。但是如果你先创建空表,然后创建索引,然后插入数据呢?您不必在大数据上建立索引,它会随着表的增长逐步更新。
  • 有了这么大的数据库,我会考虑迁移到“真正的”数据库服务器(例如 Postgres),而不是使用像 SQLite 这样的进程内数据库

标签: database sqlite


【解决方案1】:

SQLite 不允许多个写入者,并且无法合并数据库。

如果enabled,SQLite 3.8.7 或更高版本可以使用多个线程进行排序。 这可能有帮助,也可能没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2023-03-05
    • 2017-10-11
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多