Запросы на основе rowid медленны в SQLite
Я использую SQLite через DBD::SQLite в Perl для запроса больших текстовых баз данных (~10 ГБ, ~10 миллионов записей). Обычные поиски 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 МБ памяти. Теперь http://www.sqlite.org/changes.html пишет, что:
3.8.1: запросы FTS4 лучше могут использовать docid<$ limit limit, чтобы ограничить количество требуемых операций ввода-вывода
Я использовал 3.7.x, поэтому я обновил DBD::SQLite, и это привело меня к SQLite 3.8.6, но я не вижу существенных улучшений. Может ли быть так, что мне нужно реимпортировать мои базы данных, чтобы улучшить производительность docid/rowid? Я бы не ожидал так. Может быть, есть лучший способ написать запрос?