Pregunta

Solía ??hacer esto:

SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?

Lo que me daría una matriz de layerID, y luego haría un bucle y haría esto para cada uno:

SELECT DATA
FROM drawings
WHERE layerID = ?

Y todo funcionó bien. Así que ahora estoy tratando de hacerlo en un solo paso, así que intento esto:

SELECT DATA , layerID
FROM drawings
WHERE layerID = ANY (
  SELECT layerID
  FROM layers
  WHERE ownerID = ?
  AND collectionID = ?
) 

¡Pero por alguna razón, no usa el índice, para la consulta principal, SELECT DATA, etc. ! Por lo tanto, esta consulta combinada tarda mucho más en completarse, en comparación con las consultas separadas que estaba haciendo antes. (Por cierto, la subconsulta, SELECT layerID, etc. todavía usa el índice).

He determinado si está usando una consulta o no usando la declaración 'EXPLICAR'.

Tengo índices individuales en las columnas ownerID y collectionID en la tabla capas , y en la layerID columna en la tabla dibujos .

¿Qué estoy haciendo mal con mi consulta?

¿Fue útil?

Solución

Intenta unirte. CUALQUIER termina pareciéndose mucho a una UNIÓN no optimizable para el optimizador de consultas.

SELECT d.DATA, d.layerID  
FROM drawings AS d  
INNER JOIN layers AS l ON d.layerID = l.layerID  
WHERE l.ownerID = ? AND l.collectionID = ?

Otros consejos

Nunca antes había visto CUALQUIER palabra clave, pero si lo intentas

SELECT DATA , layerID
FROM drawings
WHERE layerID IN (
  SELECT layerID
  FROM layers
  WHERE ownerID = ?
  AND collectionID = ?
)

¿tendrá eso el mismo problema? Creo que no debería. Sin embargo, el INNER JOIN es probablemente un poco mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top