我正在处理一个包含 3 个表的大型(~10gb)SQLite 数据库:Documents,其中包含一个 id 和一个“title”TEXT
列,Terms,其中包含一个 id 和一个“term”TEXT
列,最后是 DocumentTerms,其中包含一个id、“documentId”INT
和“termId” INT
,将Terms 表中的行映射到Document 表中的行。如果一个文档多次包含相同的术语,则 DocumentTerms 表中有多个条目。
无论如何,我的问题是我需要对每个术语运行一个 tfidf 术语权重,这涉及这些步骤(我包括了我认为我需要获取每个步骤的查询):
- 查找该术语在所有文档中出现的次数——
SELECT COUNT(*) FROM DocumentTerms WHERE termId=id
- 找出总共有多少个文件——
SELECT COUNT(*) FROM Documents
- 查找一个术语出现在多少个文档中——
SELECT COUNT(*) FROM DocumentTerms WHERE termId=id GROUP BY documentId
显然我只需要运行#2 一次。
这么大的数据库,每次查询都需要很长时间。仅找出有多少文档 ( SELECT COUNT(*) FROM Documents
) 需要大约 45 秒。
为了加快速度,我尝试了一些编译指示。我只需要运行一次,所以我真的不在乎如果我在操作过程中断电或发生什么事情,数据库是否会损坏:
PRAGMA synchronous = OFF
PRAGMA page_size = 4096
PRAGMA cache_size = 16384
PRAGMA temp_store = MEMORY
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
我怎样才能加快这些访问时间?