加速SQLite查询

时间:2013-07-27 20:21:27

标签: sqlite

我正在处理一个包含3个表的大型(~10gb)SQLite数据库:Documents,其中包含一个id和一个“title”TEXT列,Terms,其中包含一个id和一个“term”{ {1}}列,最后是DocumentTerms,它包含一个id,一个“documentId”TEXT和一个“termId”INT,将Terms表中的行映射到Document表中的行。如果文档多次包含相同的术语,则DocumentTerms表中有多个条目。

无论如何,我的问题是我需要在每个术语上运行一个tfidf术语权重,这涉及这些步骤(我包括我认为我需要获得每一步的查询):

  1. 查找该字词在所有文档中显示的次数 - INT
  2. 查找总共有多少文档 - SELECT COUNT(*) FROM DocumentTerms WHERE termId=id
  3. 查找术语在SELECT COUNT(*) FROM Documents
  4. 中显示的文档数量

    显然我只需要运行#2一次。

    拥有如此庞大的数据库,每个查询都需要很长时间。只需找出有多少文档(SELECT COUNT(*) FROM DocumentTerms WHERE termId=id GROUP BY documentId)需要大约45秒。

    为了加快速度,我试了几个pragma。我只需要运行一次,所以我真的不在乎如果在操作过程中失去电源或某些东西,DB会被损坏:

    SELECT COUNT(*) FROM Documents

    如何加快这些访问时间?

1 个答案:

答案 0 :(得分:1)

对于只读访问,这些PRAGMA中的大多数都没有任何效果。 只有cache_size很重要; page_size可能会有所帮助,但必须在创建数据库之前设置。

当一个简单的SELECT COUNT(*)花费很长时间时,很明显你没有任何有用的索引。 没有数据库结构很难说,但以下索引可能有所帮助:

CREATE INDEX Documents_Id ON Documents(Id)

(而不是Id,您可以使用Documents表的任何 small 字段,但通常最好将主键编入索引。)< / p>

CREATE INDEX DocumentTerms_termId_documentId ON DocumentTerms(termId, documentId)

您可以查看EXPLAIN QUERY PLAN查询的查询方式executed