Как быстро запросить SQLite по списку строк? - PullRequest
0 голосов
/ 13 июня 2018

Как быстро запросить записи, соответствующие списку строк?У меня есть запрос в моем приложении для iOS, который выглядит следующим образом:

SELECT rowid, category_id
FROM items
WHERE rowid in (2, 4, 89, 4243, 44, 555, ...)

Список строк может быть несколько длинным - несколько сотен элементов будет типичным примером.

Странная вещьв том, что этот запрос выполняется несколько секунд - в некоторых случаях до 12 секунд.Это медленно, независимо от того, запускаю ли я его в оболочке SQLite или запускаю в своем приложении.

Однако, если я заменю этот запрос просто:

SELECT rowid, category_id
FROM items

, поэтому я получаю КАЖДЫЙ элемент втаблица (в моем тестовом примере около 1000 строк) и просто мое приложение игнорирует ненужные ей строки, запрос выполняется всего за несколько сотен миллисекунд.Он также быстро реагирует на оболочку SQLite.

Что здесь происходит?rowid - это первичный ключ, поэтому это должен быть быстрый индексированный поиск.Есть ли более быстрый способ выполнения таких запросов?Я бы подумал, что разбор строки запроса имеет значение, но профилирование показывает, что почти все время тратится на sqlite3_step.

1 Ответ

0 голосов
/ 13 июня 2018

SQL-запрос без предложения where всегда быстрее, чем запрос с классом where.Вы упоминаете, что RowID является первичным ключом (поэтому его кластерный индекс создан по умолчанию) в вашей таблице.

Пожалуйста, попробуйте заменить «где ... В» на «где ... между» или где ...rowId> X и RowId

Другое решение - переместить список сопоставимых идентификаторов строк во временную таблицу / представление и выполнить внутреннее соединение, чтобы получить результаты быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...