Tengo una consulta que contiene una subconsulta que siempre causa una EXPLORACIÓN de una tabla muy grande que da como resultado tiempos de consulta deficientes.¿Por qué una subconsulta causa un escaneo cuando una lista estática no lo hace?
Esta es la consulta que estoy usando:
SELECT PersonId
FROM person
WHERE PersonId IN (
SELECT PersonId
FROM relationship
WHERE RelatedToPersonId = 12270351721
);
El plan de consulta se informa como:
SCAN TABLE person (~100000 rows)
EXECUTE LIST SUBQUERY 1
SEARCH TABLE relationship USING INDEX relationship_RelatedToPersonId_IDX (RelatedToPersonId=?) (~10 rows)
La misma consulta con una lista estática (equivalente a los resultados de la subconsulta) :
SELECT PersonId
FROM person
WHERE PersonId IN (12270351727,12270351730,12270367969,12387741400);
Y el plan de consulta para que:
SEARCH TABLE person USING COVERING INDEX sqlite_autoindex_person_1 (PersonId=?) (~5 rows)
EXECUTE LIST SUBQUERY 1
¿Por qué la primera consulta solicita un escaneo si el segundo no?
Si el conjunto de datos de su sub consulta es pequeño, entonces una mesa transitoria puede trabajar. Algo así como: Seleccione Personid From (SELECCIONE la relación PersonId FROM WHERE RelatedToPersonId = 12270351721); – DallinDyer
Probé una tabla transitoria y todavía produjo un escaneo. – goto10
¿Puede existir un 'PersonId' en' relationship' si no hay una fila en 'person'? Si no, ¿la subconsulta (posiblemente con un 'distinct') no satisface toda la consulta? –