如何更快地创建索引

Alo*_*man 6 sql sqlite

我有一个约60GB的表,我正在尝试创建一个索引,它非常慢(几乎一天,仍在运行!)

我看到大部分时间都在磁盘I/O(4MB/s)上,而且它没有那么多使用内存或CPU

我试过:运行'pragma cache_zise = 10000'和'pragma page_zise = 4000'(在我创建表之后),它仍然没有帮助.

如何在合理的时间内运行"创建索引"?

Bue*_*ler 2

在数据库表上创建索引是一次性操作,并且基于许多因素,其成本可能会很高,包括索引中包含的字段数量和类型、要索引的数据表的大小、硬件等。数据库运行所在的机器的数量,甚至可能更多。

为了给出关于加快速度的合理答案,我们需要知道表的架构、您正在创建的索引的定义、您是否合理地确定您是否在索引中包含数据实际上是唯一的唯一性、什么?您的服务器的硬件规格,您的磁盘速度是多少,磁盘上有多少可用空间,您是否使用 raid 阵列,raid 的级别,您有多少内存以及利用率是多少。ETC...

话虽如此,这可能会更快,但我还没有测试过。

为您想要索引的表创建一个结构重复的表。将索引添加到新的空表中。将数据从旧表分块复制到新表。放下旧桌子。

我的理论是,在添加数据时为其建立索引比挖掘现有数据并在事后添加索引要便宜。

  • 我不知道 SQLite 的内部结构,但这对于 MS SQL Server 来说肯定不成立。事实上,当批量加载表时,删除所有索引、填充表,然后重新创建索引通常会更快。指数并不是一次性的打击。必须维护它们,这意味着表上的每次插入和潜在更新都需要在索引中移动数据。一次对一行执行一百万次通常比对数据运行一次单一排序算法的成本要高得多。 (4认同)