【问题标题】:SQLite: Prevent fragmentationSQLite:防止碎片
【发布时间】:2011-12-07 03:40:03
【问题描述】:

我需要用数百万条记录填充数据库,而我目前的例程如下:

For I = 1 to 10000000
     INSERT INTO TABLE1 ...
     INSERT INTO TABLE2 ...
     INSERT INTO TABLE3 ...
Next

我注意到记录也以这种顺序(交替)出现在磁盘上的数据库文件中。当我这样做时会不会有性能提升:

For I = 1 to 10000000
     INSERT INTO TABLE1 ...
Next

For I = 1 to 10000000
     INSERT INTO TABLE2 ...
Next

For I = 1 to 10000000
     INSERT INTO TABLE3 ...
Next

或者数据在磁盘上的结构方式对查询性能无关紧要?

【问题讨论】:

  • 为什么不直接将csv(或tsv等)文件导入表中?
  • @JackManey 因为源数据不是那种格式。将其转换为 CSV 很容易,但是如何在不先将其写入磁盘(瓶颈)的情况下将其导入?
  • 如果您将记录插入 SQLite 数据库,那么您正在将它们写入磁盘。为什么不通过将记录写入磁盘然后分批导入(或者,如有必要,将一些记录写入文件,导入并以较小的批次重复)来简化自己的工作?
  • @JackManey 当我第一次将它们转储到 CSV 文件时,我将它们 两次 写入磁盘?我正在使用事务、prepared statements 和各种 PRAGMA 语句(同步=off,journal_mode=off)来加速这个批量导入,那么 CSV 导入代码使用什么样的魔法来超越这个速度呢?跨度>
  • 那么,如果不是从文件中获取这 1000 万条记录,您首先从哪里获得?

标签: database performance sqlite optimization data-structures


【解决方案1】:

通过使用第二种方法,您将获得一些微小的性能,如果您非常在意考虑它的话。不过要看物理磁盘,碎片有多少。

我认为您应该专注于优化您的数据库和查询。

【讨论】:

  • 你说得对,但是我花了几个月的时间来优化结构和查询,所以现在是时候继续前进了 ;)
猜你喜欢
  • 2011-01-17
  • 2013-03-12
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2012-05-21
  • 2021-02-14
  • 1970-01-01
  • 2015-01-04
相关资源
最近更新 更多