我正在处理一个包含3个表的大型(~10gb)SQLite数据库:Documents,其中包含一个id和一个“title”TEXT
列,Terms,其中包含一个id和一个“term”{ {1}}列,最后是DocumentTerms,它包含一个id,一个“documentId”TEXT
和一个“termId”INT
,将Terms表中的行映射到Document表中的行。如果文档多次包含相同的术语,则DocumentTerms表中有多个条目。
无论如何,我的问题是我需要在每个术语上运行一个tfidf术语权重,这涉及这些步骤(我包括我认为我需要获得每一步的查询):
INT
SELECT COUNT(*) FROM DocumentTerms WHERE termId=id
SELECT COUNT(*) FROM Documents
显然我只需要运行#2一次。
拥有如此庞大的数据库,每个查询都需要很长时间。只需找出有多少文档(SELECT COUNT(*) FROM DocumentTerms WHERE termId=id GROUP BY documentId
)需要大约45秒。
为了加快速度,我试了几个pragma。我只需要运行一次,所以我真的不在乎如果在操作过程中失去电源或某些东西,DB会被损坏:
SELECT COUNT(*) FROM Documents
如何加快这些访问时间?
答案 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。