Почему подзапрос вызывает сканирование, а статический список - нет?

У меня есть запрос, содержащий подзапрос, который всегда вызывает 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

Почему первый запрос вызывает сканирование, а второй нет?

10
задан onedaywhen 26 October 2011 в 08:46
поделиться