我在perl中使用SQLite通过DBD :: SQLite来查询大型文本数据库(~10GB,~1000万条记录)。常规FTS MATCH搜索工作正常(它们通常在一秒钟内运行),但基于ROWID的搜索非常缓慢且占用大量内存。我试图像这样检索几个相邻的行:
my $rowrange_bottom = 20;
my $rowrange_top = 40;
my $q_c = $dbh->prepare( "SELECT * FROM tmdata WHERE (ROWID BETWEEN $rowrange_bottom AND $rowrange_top)" );
# my $q_c = $dbh->prepare( "SELECT $hitcols FROM tmdata LIMIT 21 OFFSET $rowrange_bottom" ); # tried this too, it isn't any better
$q_c->execute();
执行需要几分钟,并使用~600 MB的内存。 现在,http://www.sqlite.org/changes.html写道:
3.8.1:FTS4查询能够更好地利用docid< $ limit约束来限制所需的I / O量
我使用的是3.7.x,所以我更新了DBD :: SQLite,这让我得到了SQLite 3.8.6,但我没有看到明显的改进。难道我需要重新导入我的数据库才能在docid / rowid上获得更好的性能吗?我不希望这样。也许有更好的方法来编写查询?