Frage

Früher habe ich dies zu tun:

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

Welche würde mir eine Reihe von layerID ist, und dann würde ich Schleife und tun dies für jeden einzelnen:

SELECT DATA
FROM drawings
WHERE layerID = ?

Und alles hat gut funktioniert. So, jetzt versuche ich es in einem Schritt zu tun, so dass ich versuche Sie dies:

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

Aber aus irgendeinem Grund, es nicht den Index verwenden, für die Hauptabfrage, SELECT DATA etc! Also das eine kombinierte Abfrage dauert viel viel mehr Zeit in Anspruch, im Vergleich zu den einzelnen Abfragen ich vorher tat. (Von theway, die Unterabfrage, SELECT layerID etc noch verwendet den Index).

ich festgestellt haben, wenn es eine Abfrage oder nicht mithilfe der ‚erklären‘ Erklärung der verwendet wird.

Ich habe einzelne Indizes für die ownerID und collectionID Spalten in der layers Tabelle und auf der layerID Spalte in der Tabelle drawings.

Was bin ich falsch mit meiner Anfrage zu tun?

War es hilfreich?

Lösung

Versuchen Sie eine Verknüpfung. ANY Ende sieht viel wie eine unoptimizable UNION zu den Abfrage-Optimierer.

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 = ?

Andere Tipps

Ich habe noch nie das Schlüsselwort ANY gesehen, aber wenn Sie versuchen,

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

Wille, der das gleiche Problem? Ich glaube, es sollte nicht. Allerdings ist die INNER JOIN ist wahrscheinlich ein bisschen besser.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top