У меня есть запрос, содержащий подзапрос, который всегда вызывает SCAN очень большой таблицы, что приводит к плохим временам запросов.
Это запрос, который я использую:
SELECT PersonId
FROM person
WHERE PersonId IN (
SELECT PersonId
FROM relationship
WHERE RelatedToPersonId = 12270351721
);
План запроса отображается как:
SCAN TABLE person (~100000 rows)
EXECUTE LIST SUBQUERY 1
SEARCH TABLE relationship USING INDEX relationship_RelatedToPersonId_IDX (RelatedToPersonId=?) (~10 rows)
Тот же запрос со статическим списком (эквивалентный результатам подзапроса):
SELECT PersonId
FROM person
WHERE PersonId IN (12270351727,12270351730,12270367969,12387741400);
И план запроса для этого:
SEARCH TABLE person USING COVERING INDEX sqlite_autoindex_person_1 (PersonId=?) (~5 rows)
EXECUTE LIST SUBQUERY 1
Почему первый запрос запрашивает сканирование, если второй не работает?